Δωρεάν Διαχειριστής Αρχείων ASP.NET MVC με Ενσωματωμένο Προβολέα PDF
← Back to Blog••6 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>

Όταν ο χρήστης κάνει κλικ στο View PDF, η ενέργεια ViewPdf δημιουργεί ένα token και επιστρέφει μια δεύτερη προβολή που φιλοξενεί το widget προβολής.


4. Απόδοση του Doconut Viewer

Δημιουργήστε το Views/File/ViewPdf.cshtml. Η σελίδα χρειάζεται μόνο ένα στοιχείο container· το JavaScript widget φορτώνεται από τους ενσωματωμένους πόρους.

@{
    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 διαβάζει το AccessToken που παρείχατε, επικοινωνεί με το endpoint /doconut/DocImage.axd και μεταδίδει κάθε σελίδα ως εικόνα. Επειδή το token είναι συνδεδεμένο με την τρέχουσα συνεδρία ASP.NET, ένας χρήστης δεν μπορεί να αντιγράψει το URL και να δει το έγγραφο από άλλο πρόγραμμα περιήγησης χωρίς το ίδιο cookie συνεδρίας.


5. Διαχείριση Λήξης Token και Ασφάλειας

Το προεπιλεγμένο χρονικό όριο token του Doconut είναι 60 λεπτά (ρυθμιζόμενο μέσω DocOptions.TimeOut). Εάν ο προβολέας λάβει «Document session not found» ή «You Are Not Authorized To View This Page», η συνεδρία είτε έχει λήξει είτε το αίτημα προέρχεται από διαφορετικό περιβάλλον προγράμματος περιήγησης.

Τυπικές λύσεις:

  • Ανανέωση της σελίδας – ο ελεγκτής θα δημιουργήσει ένα νέο token.
  • Αύξηση του χρονικού ορίου – περάστε ένα προσαρμοσμένο 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 στο cookie συνεδρίας είναι συμβατό με το domain του front‑end σας. Η προεπιλογή Lax λειτουργεί για τα περισσότερα portals με ίδιο origin.

6. Επέκταση του Διαχειριστή (Προαιρετικό)

Ο βασικός διαχειριστής αρχείων είναι ήδη λειτουργικός, αλλά ίσως θέλετε να προσθέσετε:

  • Μεταφόρτωση – μια απλή φόρμα που στέλνει ένα IFormFile και το αποθηκεύει στο _root.
  • Πλοήγηση φακέλων – τροποποιήστε την ενέργεια Index ώστε να δέχεται σχετικό μονοπάτι και να το προστατεύει από διαπέραση καταλόγου (Path.GetFullPath + έλεγχος StartsWith(_root)).
  • Αναζήτηση – φιλτράρετε τα files κατά όνομα πριν τα περάσετε στη προβολή.

Όλες αυτές οι επεκτάσεις παραμένουν εντός του ίδιου προτύπου MVC και συνεχίζουν να επωφελούνται από τον ίδιο viewer προστατευμένο με συνεδρία Doconut.


7. Τι Έχετε Επιτύχει

  • Ένας δωρεάν διαχειριστής αρχείων ASP.NET MVC – χωρίς βιβλιοθήκες UI τρίτων, χωρίς τέλη αδειοδότησης.
  • Απόδοση PDF στον περιηγητή μέσω του καθολικού viewer του Doconut, αποφεύγοντας την ανάγκη εγκατάστασης Office ή Adobe στον πελάτη.
  • Ασφαλής πρόσβαση με βάση token που αξιοποιεί την κατάσταση συνεδρίας ASP.NET, αποτρέποντας τυχαία κοινή χρήση URL.
  • Μια μονή βάση κώδικα που λειτουργεί για .NET 6 και .NET 8 και μπορεί να μεταφερθεί σε Razor Pages ή minimal APIs με μόνο τις κλήσεις εγγραφής (AddDoconut, UseSession) να αλλάζουν.

Αναπτύξτε την εφαρμογή σε IIS, Azure App Service ή Docker – η ίδια διαμόρφωση Program.cs λειτουργεί παντού επειδή το Doconut τρέχει σε .NET 6+ και δεν απαιτεί κανένα εγγενές στοιχείο Office.

#ASP.NET MVC#File Manager#PDF Viewer#.NET#Doconut#Διαχειριστής Αρχείων#Προβολέας PDF