
Gestionnaire de fichiers ASP.NET MVC gratuit avec visionneuse PDF intégrée
Créez un gestionnaire de fichiers ASP.NET MVC gratuit qui affiche les PDFs
Vous souhaitez une page qui répertorie les fichiers stockés sur le serveur, permet à l'utilisateur de les télécharger ou de les supprimer, et ouvre tout PDF dans le navigateur sans quitter le site. Le guide suivant vous montre comment faire exactement cela avec ASP.NET MVC simple, le cache de session intégré, et le visionneur universel de documents de Doconut.
1. Créez une application MVC minimale
Créez un nouveau projet MVC dans Visual Studio (toute édition, y compris l'édition Community gratuite).
Ajoutez un FileController qui hébergera les actions du gestionnaire de fichiers :
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;
}
Le contrôleur fait trois choses :
- Index – lit le dossier
App_Data/Docset transmet les noms de fichiers à une vue. - Download / Delete – actions MVC standard qui utilisent l’aide intégrée
PhysicalFile. - ViewPdf – ouvre le PDF sélectionné avec Doconut, reçoit un jeton de sécurité et le transmet à une vue Razor.
2. Configurez l’état de session et les services Doconut
Le visionneur de Doconut repose sur l’état de session ASP.NET pour protéger le jeton qui identifie un document. Ajoutez les services requis dans Program.cs (ou Startup.cs pour les projets .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();
Points clés :
AddDistributedMemoryCachefournit le magasin en mémoire dontAddSessiona besoin.UseSession()doit apparaître avant le middleware Doconut ; sinon vous verrez l’erreur d’exécution « Session middleware not configured. »MiddlewarePathetResourcesPathsont des chaînes de coordination – la branche middleware réelle doit correspondre au chemin que vous configurez.
3. Créer la vue du gestionnaire de fichiers
Créez Views/File/Index.cshtml. Il répertorie les fichiers et fournit des actions pour télécharger, supprimer et afficher le 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>
Lorsque l'utilisateur clique sur View PDF, l'action ViewPdf crée un jeton et renvoie une seconde vue qui héberge le widget du visualiseur.
4. Rendre le visualiseur Doconut
Créez Views/File/ViewPdf.cshtml. La page ne nécessite qu'un élément conteneur ; le widget JavaScript est chargé à partir des ressources intégrées.
@{
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>
Le widget lit le AccessToken que vous avez fourni, contacte le point de terminaison /doconut/DocImage.axd et diffuse chaque page sous forme d'image. Comme le jeton est lié à la session ASP.NET actuelle, un utilisateur ne peut pas copier l'URL et afficher le document depuis un autre navigateur sans le même cookie de session.
5. Gestion de l'expiration du jeton et de la sécurité
Le délai d'expiration du jeton par défaut de Doconut est de 60 minutes (configurable via DocOptions.TimeOut). Si le visualiseur reçoit « Document session not found » ou « You Are Not Authorized To View This Page », la session a soit expiré, soit la requête provient d'un autre contexte de navigateur.
Remèdes typiques :
- Actualiser la page – le contrôleur générera un nouveau jeton.
- Augmenter le délai d'expiration – passez un
DocOptionspersonnalisé lors de l'ouverture du document :
var options = new DocOptions { TimeOut = TimeSpan.FromHours(2) };
var token = await _viewer.OpenDocumentAsync(
path,
new Doconut.PdfConfig { AllowSearch = true },
options,
CancellationToken.None);
- Configurations cross‑origin – assurez‑vous que l'attribut
SameSitedu cookie de session est compatible avec votre domaine front‑end. LeLaxpar défaut fonctionne pour la plupart des portails même origine.
6. Étendre le gestionnaire (facultatif)
Le gestionnaire de fichiers de base est déjà fonctionnel, mais vous pourriez vouloir ajouter :
- Upload – un formulaire simple qui envoie un
IFormFileet le sauvegarde dans_root. - Navigation de dossiers – modifiez l'action
Indexpour accepter un chemin relatif et le protéger contre les traversées de répertoires (Path.GetFullPath+ vérificationStartsWith(_root)). - Recherche – filtrez
filespar nom avant de les transmettre à la vue.
Toutes ces extensions restent dans le même modèle MVC et continuent de bénéficier du même visualiseur Doconut protégé par session.
7. Ce que vous avez accompli
- Un gestionnaire de fichiers ASP.NET MVC gratuit – aucune bibliothèque UI tierce, aucun frais de licence.
- Rendu PDF dans le navigateur via le visualiseur universel de Doconut, évitant la nécessité d'installations Office ou Adobe côté client.
- Accès sécurisé basé sur un jeton qui exploite l'état de session ASP.NET, empêchant le partage d'URL arbitraire.
- Une base de code unique qui fonctionne pour .NET 6 et .NET 8 et peut être portée vers Razor Pages ou des API minimalistes avec seulement les appels d'enregistrement (
AddDoconut,UseSession) qui changent.
Déployez l'application sur IIS, Azure App Service ou Docker – la même configuration Program.cs fonctionne partout car Doconut s'exécute sur .NET 6+ et ne nécessite aucun composant Office natif.