מנהל קבצים חינמי ב‑ASP.NET MVC עם מציג PDF מובנה
← Back to Blog••5 min read

מנהל קבצים חינמי ב‑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;
}

הבקר מבצע שלוש פעולות:

  1. Index – קורא את התיקייה App_Data/Docs ומעביר את שמות הקבצים לתצוגה.
  2. Download / Delete – פעולות MVC סטנדרטיות המשתמשות בעזרית PhysicalFile המובנית.
  3. 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 מקומיים.

#ASP.NET MVC#File Manager#PDF Viewer#.NET#Doconut#מנהל קבצים#מציג PDF