
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:
- Index – načte složku
App_Data/Docsa předá názvy souborů do pohledu. - Download / Delete – standardní MVC akce, které používají vestavěný pomocník
PhysicalFile. - 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:
AddDistributedMemoryCacheposkytuje in‑memory úložiště, kteréAddSessionpotřebuje.UseSession()musí být voláno před middleware Doconut; jinak se zobrazí runtime chyba „Session middleware not configured.“MiddlewarePathaResourcesPathjsou 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
SameSitena cookie relace je kompatibilní s vaší front‑end doménou. VýchozíLaxfunguje 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á
IFormFilea 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+ kontrolaStartsWith(_root)). - Vyhledávání – filtrovat
filespodle 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.