
Gratis ASP.NET MVC‑filhanterare med inbyggd PDF‑visare
Bygg en gratis ASP.NET MVC‑filhanterare som visar PDF‑filer
Du vill ha en sida som listar filerna som lagras på servern, låter användaren ladda ner eller ta bort dem, och öppnar vilken PDF som helst i webbläsaren utan att lämna webbplatsen. Följande guide visar hur du gör exakt detta med ren ASP.NET MVC, den inbyggda sessionscachen och Doconut:s universella dokumentvisare.
1. Skapa en minimal MVC‑applikation
Skapa ett nytt MVC‑projekt i Visual Studio (valfri edition, inklusive den kostnadsfria Community‑editionen).
Lägg till en FileController som kommer att hantera filhanteraråtgärderna:
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 is created here (see section 2)
var token = await _viewer.OpenDocumentAsync(
path,
new Doconut.PdfConfig { AllowSearch = true },
new DocOptions(),
CancellationToken.None);
ViewBag.Token = token;
ViewBag.BasePath = "doconut"; // matches the middleware branch
ViewBag.ResPath = "doconut-res/images";// embedded resources
return View();
}
private readonly Doconut.Viewer _viewer;
public FileController(Doconut.Viewer viewer) => _viewer = viewer;
}
Kontrollern gör tre saker:
- Index – läser mappen
App_Data/Docsoch skickar filnamnen till en vy. - Download / Delete – standard‑MVC‑åtgärder som använder den inbyggda
PhysicalFile‑hjälpen. - ViewPdf – öppnar den valda PDF‑filen med Doconut, får en säkerhetstoken och skickar den till en Razor‑vy.
2. Anslut sessionsstate och Doconut‑tjänster
Doconut:s visare förlitar sig på ASP.NET‑sessionsstate för att skydda token som identifierar ett dokument. Lägg till de nödvändiga tjänsterna i Program.cs (eller Startup.cs för .NET 6‑projekt):
var builder = WebApplication.CreateBuilder(args);
// MVC services
builder.Services.AddControllersWithViews();
// Session cache – required for token validation
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession();
// Doconut registration – point to your license file
builder.Services.AddDoconut(options =>
{
options.LicensePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
options.MiddlewarePath = "/doconut";
options.ResourcesPath = "/doconut-res";
options.UnsafeMode = false; // keep the default security
});
var app = builder.Build();
// Session must run before the viewer middleware
app.UseSession();
// The Doconut middleware must be mapped to the path configured above.
// See Doconut documentation for the exact mapping call (e.g., app.Map("/doconut", …)).
app.UseRouting();
app.UseEndpoints(endpoints => endpoints.MapDefaultControllerRoute());
app.Run();
Viktiga punkter:
AddDistributedMemoryCachetillhandahåller det minnesbaserade lagret somAddSessionbehöver.UseSession()måste placeras före Doconut‑middleware; annars får du körfelmeddelandet “Session middleware not configured.”MiddlewarePathochResourcesPathär koordineringssträngar – den faktiska middleware‑grenen måste matcha den sökväg du konfigurerar.
3. Skapa fil‑hanterarvyn
Skapa Views/File/Index.cshtml. Den listar filer och erbjuder åtgärder för nedladdning, borttagning och PDF‑visning.
@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>
När användaren klickar på View PDF, skapar ViewPdf‑åtgärden en token och returnerar en andra vy som innehåller visningswidgeten.
4. Rendera Doconut‑visaren
Skapa Views/File/ViewPdf.cshtml. Sidan behöver bara ett container‑element; JavaScript‑widgeten laddas från de inbäddade resurserna.
@{
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>
Widgeten läser AccessToken du tillhandahöll, kontaktar /doconut/DocImage.axd‑endpointen och strömmar varje sida som en bild. Eftersom token är knuten till den aktuella ASP.NET‑sessionen kan en användare inte kopiera URL:en och visa dokumentet från en annan webbläsare utan samma sessions‑cookie.
5. Hantera tokenutgång och säkerhet
Doconuts standard‑token timeout är 60 minuter (kan konfigureras via DocOptions.TimeOut). Om visaren får “Document session not found” eller “You Are Not Authorized To View This Page” har sessionen antingen gått ut eller så kommer begäran från ett annat webbläsarkontext.
Vanliga åtgärder:
- Uppdatera sidan – kontrollern genererar en ny token.
- Öka timeouten – skicka ett anpassat
DocOptionsnär dokumentet öppnas:
var options = new DocOptions { TimeOut = TimeSpan.FromHours(2) };
var token = await _viewer.OpenDocumentAsync(
path,
new Doconut.PdfConfig { AllowSearch = true },
options,
CancellationToken.None);
- Cross‑origin‑inställningar – säkerställ att
SameSite‑attributet på sessions‑cookien är kompatibelt med din front‑end‑domän. StandardvärdetLaxfungerar för de flesta same‑origin‑portaler.
6. Utöka hanteraren (valfritt)
Kärn‑filhanteraren är redan funktionell, men du kanske vill lägga till:
- Upload – ett enkelt formulär som postar en
IFormFileoch sparar den till_root. - Mappnavigering – ändra
Index‑åtgärden för att acceptera en relativ sökväg och skydda den mot katalogtraversering (Path.GetFullPath+StartsWith(_root)‑kontroll). - Sök – filtrera
filesefter namn innan de skickas till vyn.
Alla dessa utökningar förblir inom samma MVC‑mönster och fortsätter att dra nytta av den samma sessionsskyddade Doconut‑visaren.
7. Vad du har uppnått
- En gratis ASP.NET MVC‑filhanterare – inga tredjeparts‑UI‑bibliotek, inga licensavgifter.
- PDF‑rendering i webbläsaren via Doconuts universella visare, vilket undviker behovet av Office‑ eller Adobe‑installationer på klienten.
- Säker token‑baserad åtkomst som utnyttjar ASP.NET‑sessions‑state, vilket förhindrar godtycklig delning av URL:er.
- En ensam kodbas som fungerar för .NET 6 och .NET 8 och kan porteras till Razor Pages eller minimal APIs med endast registreringsanropen (
AddDoconut,UseSession) förändrade.
Distribuera appen till IIS, Azure App Service eller Docker – samma Program.cs‑konfiguration fungerar överallt eftersom Doconut körs på .NET 6+ och inte kräver några inhemska Office‑komponenter.