Ücretsiz ASP.NET MVC Dosya Yöneticisi ve Yerleşik PDF Görüntüleyici
← Back to Blog••5 min read

Ücretsiz ASP.NET MVC Dosya Yöneticisi ve Yerleşik PDF Görüntüleyici

Ücretsiz ASP.NET MVC Dosya Yöneticisi Oluşturun ve PDF'leri Gösterin

Sunucuda depolanan dosyaları listeleyen, kullanıcının indirmesine veya silmesine izin veren ve siteyi terk etmeden herhangi bir PDF'yi tarayıcı içinde açan bir sayfa istiyorsunuz. Aşağıdaki rehber, bunu saf ASP.NET MVC, yerleşik oturum önbelleği ve Doconut’un evrensel belge görüntüleyicisi ile nasıl yapacağınızı gösterir.


1. Minimal MVC Uygulaması Oluşturun

Visual Studio'da yeni bir MVC projesi oluşturun (herhangi bir sürüm, ücretsiz Community sürümü dahil).

Dosya yöneticisi eylemlerini barındıracak bir FileController ekleyin:

public class FileController : Controller
{
    private readonly string _root = Path.Combine(Directory.GetCurrentDirectory(), "App_Data", "Docs");

    public IActionResult Index()
    {
        var files = Directory.GetFiles(_root).Select(Path.GetFileName).ToList();
        return View(files);
    }

    public IActionResult Download(string name)
    {
        var path = Path.Combine(_root, name);
        if (!System.IO.File.Exists(path)) return NotFound();
        var mime = "application/octet-stream";
        return PhysicalFile(path, mime, name);
    }

    public IActionResult Delete(string name)
    {
        var path = Path.Combine(_root, name);
        if (System.IO.File.Exists(path)) System.IO.File.Delete(path);
        return RedirectToAction(nameof(Index));
    }

    public async Task<IActionResult> ViewPdf(string name)
    {
        var path = Path.Combine(_root, name);
        if (!System.IO.File.Exists(path)) return NotFound();

        // The viewer token burada oluşturulur (bölüm 2'ye bakın)
        var token = await _viewer.OpenDocumentAsync(
            path,
            new Doconut.PdfConfig { AllowSearch = true },
            new DocOptions(),
            CancellationToken.None);

        ViewBag.Token = token;
        ViewBag.BasePath = "doconut";          // middleware dalına eşleşir
        ViewBag.ResPath = "doconut-res/images";// gömülü kaynaklar
        return View();
    }

    private readonly Doconut.Viewer _viewer;
    public FileController(Doconut.Viewer viewer) => _viewer = viewer;
}

Denetleyici üç şey yapar:

  1. Index – App_Data/Docs klasörünü okur ve dosya adlarını bir görünüme geçirir.
  2. Download / Delete – yerleşik PhysicalFile yardımcı programını kullanan standart MVC eylemleri.
  3. ViewPdf – seçilen PDF'yi Doconut ile açar, bir güvenlik belirteci alır ve bunu bir Razor görünümüne geçirir.

2. Oturum Durumunu ve Doconut Servislerini Bağlayın

Doconut’un görüntüleyicisi, bir belgeyi tanımlayan belirteci korumak için ASP.NET oturum durumuna dayanır. Gerekli servisleri Program.cs içine ekleyin (veya .NET 6 projeleri için Startup.cs).

var builder = WebApplication.CreateBuilder(args);

// MVC hizmetleri
builder.Services.AddControllersWithViews();

// Session önbelleği – token doğrulaması için gerekli
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession();

// Doconut kaydı – lisans dosyanıza işaret edin
builder.Services.AddDoconut(options =>
{
    options.LicensePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
    options.MiddlewarePath = "/doconut";
    options.ResourcesPath = "/doconut-res";
    options.UnsafeMode = false; // varsayılan güvenliği koru
});

var app = builder.Build();

// Session, viewer middleware'den önce çalışmalıdır
app.UseSession();

// Doconut middleware'i yukarıda yapılandırılan yola eşlenmelidir.
// Tam eşleme çağrısı için Doconut belgelerine bakın (ör., app.Map("/doconut", …)).

app.UseRouting();
app.UseEndpoints(endpoints => endpoints.MapDefaultControllerRoute());

app.Run();

Ana noktalar:

  • AddDistributedMemoryCache, AddSession'ın ihtiyaç duyduğu bellek içi depolamayı sağlar.
  • UseSession() olmalı Doconut ara katmanından önce; aksi takdirde “Session middleware not configured.” çalışma zamanı hatasını göreceksiniz.
  • MiddlewarePath ve ResourcesPath koordinasyon dizeleridir – gerçek ara katman dalı, yapılandırdığınız yol ile eşleşmelidir.

3. Dosya‑Yöneticisi Görünümünü Oluştur

Views/File/Index.cshtml oluşturun. Dosyaları listeler ve indirme, silme ve PDF önizleme eylemlerini sunar.

@model List<string>
<h2>Document Library</h2>
<table>
    <thead><tr><th>Name</th><th>Actions</th></tr></thead>
    <tbody>
@foreach (var f in Model)
{
    <tr>
        <td>@f</td>
        <td>
            <a asp-action="Download" asp-route-name="@f">Download</a> |
            <a asp-action="Delete"   asp-route-name="@f">Delete</a> |
            @if (Path.GetExtension(f).Equals(".pdf", StringComparison.OrdinalIgnoreCase))
            {
                <a asp-action="ViewPdf" asp-route-name="@f">View PDF</a>
            }
        </td>
    </tr>
}
    </tbody>
</table>

Kullanıcı PDF Görüntüle'ye tıkladığında, ViewPdf eylemi bir token oluşturur ve görüntüleyici widget'ını barındıran ikinci bir görünüm döndürür.


4. Doconut Görüntüleyicisini Render Et

Views/File/ViewPdf.cshtml oluşturun. Sayfa yalnızca bir konteyner öğesine ihtiyaç duyar; JavaScript widget'ı gömülü kaynaklardan yüklenir.

@{
    var token = ViewBag.Token as string;
    var basePath = ViewBag.BasePath as string;
    var resPath = ViewBag.ResPath as string;
}
<h2>PDF Preview</h2>
<div id="div_ctlDoc"></div>

<script src="@($"{basePath}/docViewer.js")"></script>
<link rel="stylesheet" href="@($"{basePath}/docViewer.css")" />

<script>
    $('#div_ctlDoc').docViewer({
        AccessToken: '@token',
        BasePath: '@basePath',
        ResPath: '@resPath',
        FitType: 'width',
        showThumbs: true,
        autoLoad: true,
        onError: function (msg) { console.error(msg); }
    });
</script>

Widget, sağladığınız AccessToken'ı okur, /doconut/DocImage.axd uç noktasına bağlanır ve her sayfayı bir görüntü olarak akıtır. Token mevcut ASP.NET oturumuna bağlı olduğundan, bir kullanıcı URL'yi kopyalayıp aynı oturum çerezine sahip olmadan başka bir tarayıcıda belgeyi görüntüleyemez.


5. Token Süresinin Dolması ve Güvenliği Ele Alma

Doconut'un varsayılan token zaman aşımı 60 dakikadır (DocOptions.TimeOut aracılığıyla yapılandırılabilir). Görüntüleyici “Belge oturumu bulunamadı” veya “Bu Sayfayı Görüntüleme Yetkiniz Yok” mesajlarını alırsa, oturum ya süresi dolmuş demektir ya da istek farklı bir tarayıcı bağlamından gelmektedir.

Tipik çözümler:

  • Sayfayı yenile – denetleyici yeni bir token oluşturur.
  • Zaman aşımını artır – belgeyi açarken özel bir DocOptions geçirin:
var options = new DocOptions { TimeOut = TimeSpan.FromHours(2) };
var token = await _viewer.OpenDocumentAsync(
    path,
    new Doconut.PdfConfig { AllowSearch = true },
    options,
    CancellationToken.None);
  • Cross‑origin ayarları – oturum çerezindeki SameSite özniteliğinin ön uç domaininizle uyumlu olduğundan emin olun. Varsayılan Lax çoğu aynı‑origin portalı için çalışır.

6. Yöneticiyi Genişletme (İsteğe Bağlı)

Temel dosya yöneticisi zaten işlevsel, ancak eklemek isteyebilirsiniz:

  • Yükleme – bir IFormFile gönderip _root'a kaydeden basit bir form.
  • Klasör gezinmesi – Index eylemini göreli bir yol kabul edecek şekilde değiştirin ve dizin geçişine karşı koruyun (Path.GetFullPath + StartsWith(_root) kontrolü).
  • Arama – files'ı görünüme göndermeden önce isimlerine göre filtreleyin.

Bu uzantıların tümü aynı MVC deseninde kalır ve aynı oturum‑korumalı Doconut görüntüleyicisinden faydalanmaya devam eder.


7. Başardıklarınız

  • Ücretsiz bir ASP.NET MVC dosya yöneticisi – üçüncü‑taraf UI kütüphaneleri yok, lisans ücreti yok.
  • Tarayıcı içinde PDF renderleme Doconut'un evrensel görüntüleyicisi aracılığıyla, istemcide Office veya Adobe kurulumuna ihtiyaç duymaz.
  • Güvenli token‑tabanlı erişim ASP.NET oturum durumunu kullanır, rastgele URL paylaşımını önler.
  • Tek bir kod tabanı .NET 6 ve .NET 8 için çalışır ve yalnızca kayıt çağrıları (AddDoconut, UseSession) değiştirildiğinde Razor Pages veya minimal API'lere taşınabilir.

Uygulamayı IIS, Azure App Service veya Docker'a dağıtın – aynı Program.cs yapılandırması her yerde çalışır çünkü Doconut .NET 6+ üzerinde çalışır ve herhangi bir yerel Office bileşeni gerektirmez.

#ASP.NET MVC#File Manager#PDF Viewer#.NET#Doconut#Dosya Yöneticisi#PDF Görüntüleyici