
מנהל קבצים חינמי ב‑ASP.NET MVC עם מציג PDF מובנה
בנה מנהל קבצים חינמי ב‑ASP.NET MVC המציג קבצי PDF
אתה רוצה דף שמציג את הקבצים השמורים בשרת, מאפשר למשתמש להוריד או למחוק אותם, ופותח כל קובץ PDF בדפדפן מבלי לעזוב את האתר. המדריך הבא מראה כיצד לבצע זאת בדיוק עם ASP.NET MVC רגיל, מטמון הסשן המובנה, ומציג המסמכים האוניברסלי של Doconut.
1. יצירת אפליקציית MVC מינימלית
צור פרויקט MVC חדש ב‑Visual Studio (כל גרסה, כולל הגרסה החינמית Community).
הוסף FileController שיארח את פעולות מנהל הקבצים:
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;
}
הבקר מבצע שלוש פעולות:
- Index – קורא את התיקייה
App_Data/Docsומעביר את שמות הקבצים לתצוגה. - Download / Delete – פעולות MVC סטנדרטיות המשתמשות בעזרית
PhysicalFileהמובנית. - ViewPdf – פותח את קובץ ה‑PDF שנבחר עם Doconut, מקבל אסימון אבטחה, ומעביר אותו לתצוגת Razor.
2. חיבור מצב הסשן ושירותי Doconut
המציג של Doconut מסתמך על מצב הסשן של ASP.NET כדי להגן על האסימון שמזהה מסמך. הוסף את השירותים הדרושים ב‑Program.cs (או Startup.cs עבור פרויקטים ב‑.NET 6):
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();
נקודות מפתח:
AddDistributedMemoryCacheמספק את מאגר הזיכרון הפנימי ש‑AddSessionצריך.UseSession()חייב להופיע לפני ה‑middleware של Doconut; אחרת תתקבל שגיאת זמן ריצה “Session middleware not configured.”MiddlewarePathו‑ResourcesPathהם מחרוזות תיאום – סניף ה‑middleware בפועל חייב להתאים לנתיב שאתה מגדיר.
3. יצירת תצוגת מנהל הקבצים
צור Views/File/Index.cshtml. הקובץ מציג רשימת קבצים ומספק פעולות להורדה, מחיקה והצגת 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>
כאשר המשתמש לוחץ על הצג PDF, הפעולה ViewPdf יוצרת אסימון ומחזירה תצוגה שנייה שמארחת את וידג'ט הצופה.
4. הצגת מציג Doconut
צור Views/File/ViewPdf.cshtml. הדף דורש רק אלמנט קונטיינר; וידג'ט ה‑JavaScript נטען מהמשאבים המוטמעים.
@{
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>
הוידג'ט קורא את AccessToken שסיפקת, פונה לנקודת הקצה /doconut/DocImage.axd, ומשדר כל עמוד כתמונה. מכיוון שהאסימון קשור למפגש ה‑ASP.NET הנוכחי, משתמש לא יכול להעתיק את ה‑URL ולצפות במסמך מדפדפן אחר ללא קוביית העוגייה של המפגש.
5. טיפול בפקיעת אסימון ואבטחה
הזמן הקצוב ברירת המחדל של אסימון ב‑Doconut הוא 60 דקות (ניתן לשנות באמצעות DocOptions.TimeOut). אם הצופה מקבל “Document session not found” או “You Are Not Authorized To View This Page”, המשמרת או שפג תוקפה או שהבקשה מגיעה מהקשר דפדפן שונה.
פתרונות נפוצים:
- רענון העמוד – הבקר ייצור אסימון חדש.
- הגדלת זמן הקצאה – העברת
DocOptionsמותאם אישית בעת פתיחת המסמך:
var options = new DocOptions { TimeOut = TimeSpan.FromHours(2) };
var token = await _viewer.OpenDocumentAsync(
path,
new Doconut.PdfConfig { AllowSearch = true },
options,
CancellationToken.None);
- הגדרות cross‑origin – ודא שמאפיין
SameSiteשל קוביית העוגייה תואם לדומיין הקצה שלך. ברירת המחדלLaxעובדת ברוב הפורטלים בעל אותם מקור.
6. הרחבת המנהל (אופציונלי)
מנהל הקבצים המרכזי כבר פועל, אך ייתכן ותרצו להוסיף:
- העלאה – טופס פשוט שמעלה
IFormFileושומר אותו ב‑_root. - ניווט בתיקיות – שינוי הפעולה
Indexלקבלת נתיב יחסי והגנה מפני מעבר תיקיות (Path.GetFullPath+ בדיקתStartsWith(_root)). - חיפוש – סינון
filesלפי שם לפני העברתם לתצוגה.
כל ההרחבות הללו נשארות במסגרת דפוס MVC זהה וממשיכות ליהנות מצופה Doconut המוגן על ידי המפגש.
7. מה שהשגתם
- מנהל קבצים חינמי ב‑ASP.NET MVC – ללא ספריות UI של צד שלישי, ללא עלויות רישוי.
- הצגת PDF בתוך הדפדפן באמצעות מציג Doconut האוניברסלי, ללא צורך בהתקנות Office או Adobe בצד הלקוח.
- גישה מאובטחת מבוססת אסימון המנצל את מצב המפגש של ASP.NET, ומונע שיתוף קישורים באופן שרירותי.
- קוד בסיס יחיד שעובד ב‑.NET 6 וב‑.NET 8 וניתן להעבירו ל‑Razor Pages או לממשקי API מינימליים עם שינוי רק בקריאות הרישום (
AddDoconut,UseSession).
פרסו את האפליקציה ל‑IIS, Azure App Service או Docker – תצורת Program.cs זהה פועלת בכל מקום מכיוון ש‑Doconut פועל על .NET 6+ ואינו דורש רכיבי Office מקומיים.