Bezplatný správce souborů ASP.NET MVC s vestavěným prohlížečem PDF
← Back to Blog••5 min read

Bezplatný správce souborů ASP.NET MVC s vestavěným prohlížečem PDF

Vytvořte bezplatný správce souborů ASP.NET MVC, který zobrazuje PDF

Chcete stránku, která vypíše soubory uložené na serveru, umožní uživateli je stáhnout nebo smazat a otevře libovolný PDF přímo v prohlížeči, aniž by opustil web. Následující návod vám ukáže, jak to přesně provést pomocí čistého ASP.NET MVC, vestavěné mezipaměti relace a univerzálního prohlížeče dokumentů Doconut.


1. Vytvořte minimální aplikaci MVC

Vytvořte nový projekt MVC ve Visual Studiu (libovolná edice, včetně bezplatné edice Community).

Přidejte FileController, který bude hostovat akce správce souborů:

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();

        // Token prohlížeče je vytvořen zde (viz sekce 2)
        var token = await _viewer.OpenDocumentAsync(
            path,
            new Doconut.PdfConfig { AllowSearch = true },
            new DocOptions(),
            CancellationToken.None);

        ViewBag.Token = token;
        ViewBag.BasePath = "doconut";          // odpovídá větvi middleware
        ViewBag.ResPath = "doconut-res/images";// vložené zdroje
        return View();
    }

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

Kontroler provádí tři věci:

  1. Index – načte složku App_Data/Docs a předá názvy souborů do pohledu.
  2. Download / Delete – standardní MVC akce, které používají vestavěný pomocník PhysicalFile.
  3. ViewPdf – otevře vybraný PDF pomocí Doconut, získá bezpečnostní token a předá jej Razor pohledu.

2. Nastavte stav relace a služby Doconut

Prohlížeč Doconut se spoléhá na stav relace ASP.NET, aby chránil token, který identifikuje dokument. Přidejte požadované služby v souboru Program.cs (nebo Startup.cs pro projekty .NET 6):

var builder = WebApplication.CreateBuilder(args);

// Služby MVC
builder.Services.AddControllersWithViews();

// Mezipaměť relace – vyžadována pro ověření tokenu
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession();

// Registrace Doconut – nasměrujte na soubor licence
builder.Services.AddDoconut(options =>
{
    options.LicensePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
    options.MiddlewarePath = "/doconut";
    options.ResourcesPath = "/doconut-res";
    options.UnsafeMode = false; // zachovat výchozí zabezpečení
});

var app = builder.Build();

// Relace musí být spuštěna před middleware prohlížeče
app.UseSession();

// Middleware Doconut musí být namapován na výše nakonfigurovanou cestu.
// Viz dokumentace Doconut pro přesné volání mapování (např. app.Map("/doconut", …)).

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

app.Run();

Klíčové body:

  • AddDistributedMemoryCache poskytuje in‑memory úložiště, které AddSession potřebuje.
  • UseSession() musí být voláno před middleware Doconut; jinak se zobrazí runtime chyba „Session middleware not configured.“
  • MiddlewarePath a ResourcesPath jsou koordinační řetězce – skutečná větev middleware musí odpovídat cestě, kterou nastavíte.

3. Vytvoření zobrazení správce souborů

Vytvořte Views/File/Index.cshtml. Zobrazuje seznam souborů a poskytuje akce pro stažení, smazání a zobrazení PDF.

@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>

Když uživatel klikne na View PDF, akce ViewPdf vytvoří token a vrátí druhé zobrazení, které hostí widget prohlížeče.


4. Vykreslení Doconut Vieweru

Vytvořte Views/File/ViewPdf.cshtml. Stránka potřebuje pouze kontejnerový prvek; JavaScript widget je načten z vložených zdrojů.

@{
    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 načte vámi poskytnutý AccessToken, kontaktuje koncový bod /doconut/DocImage.axd a streamuje každou stránku jako obrázek. Protože je token svázán s aktuální ASP.NET relací, uživatel nemůže zkopírovat URL a zobrazit dokument v jiném prohlížeči bez stejného cookie relace.


5. Zpracování vypršení tokenu a zabezpečení

Výchozí časový limit tokenu v Doconut je 60 minut (lze nastavit pomocí DocOptions.TimeOut). Pokud prohlížeč obdrží „Document session not found“ nebo „You Are Not Authorized To View This Page“, relace buď vypršela, nebo požadavek pochází z jiného kontextu prohlížeče.

Typické řešení:

  • Obnovit stránku – řadič vygeneruje nový token.
  • Zvýšit časový limit – při otevírání dokumentu předat vlastní DocOptions:
var options = new DocOptions { TimeOut = TimeSpan.FromHours(2) };
var token = await _viewer.OpenDocumentAsync(
    path,
    new Doconut.PdfConfig { AllowSearch = true },
    options,
    CancellationToken.None);
  • Nastavení cross‑origin – ujistěte se, že atribut SameSite na cookie relace je kompatibilní s vaší front‑end doménou. Výchozí Lax funguje pro většinu portálů se stejným původem.

6. Rozšíření správce (volitelné)

Základní správce souborů již funguje, ale můžete chtít přidat:

  • Upload – jednoduchý formulář, který odesílá IFormFile a ukládá jej do _root.
  • Navigace ve složkách – upravit akci Index, aby přijímala relativní cestu a chránila ji před průnikem do adresářů (Path.GetFullPath + kontrola StartsWith(_root)).
  • Vyhledávání – filtrovat files podle názvu před předáním do zobrazení.

Všechny tyto rozšíření zůstávají v rámci stejného MVC vzoru a nadále těží ze stejného session‑chráněného Doconut prohlížeče.


7. Co jste dosáhli

  • Bezplatný ASP.NET MVC správce souborů – žádné knihovny UI třetích stran, žádné licenční poplatky.
  • Vykreslování PDF v prohlížeči pomocí univerzálního prohlížeče Doconut, čímž se eliminuje potřeba instalovat Office nebo Adobe na klientovi.
  • Zabezpečený přístup založený na tokenu, který využívá stav ASP.NET relace a zabraňuje volnému sdílení URL.
  • Jednotný kódový základ, který funguje pro .NET 6 a .NET 8 a lze jej přenést na Razor Pages nebo minimal APIs pouhým změněním registračních volání (AddDoconut, UseSession).

Nasazujte aplikaci na IIS, Azure App Service nebo Docker – stejná konfigurace Program.cs funguje všude, protože Doconut běží na .NET 6+ a nevyžaduje žádné nativní komponenty Office.

#ASP.NET MVC#File Manager#PDF Viewer#.NET#Doconut#Správce souborů#Prohlížeč PDF