
Gerenciador de Arquivos ASP.NET MVC Gratuito com Visualizador de PDF Integrado
Crie um Gerenciador de Arquivos ASP.NET MVC Gratuito que Exibe PDFs
Você quer uma página que liste os arquivos armazenados no servidor, permita ao usuário baixá‑los ou excluí‑‑los, e abra qualquer PDF no navegador sem sair do site. O guia a seguir mostra como fazer exatamente isso com ASP.NET MVC puro, o cache de sessão embutido e o visualizador universal de documentos da Doconut.
1. Estruture uma Aplicação MVC Minimalista
Crie um novo projeto MVC no Visual Studio (qualquer edição, incluindo a edição Community gratuita).
Adicione um FileController que hospedará as ações do gerenciador de arquivos:
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();
// O token do visualizador é criado aqui (veja a seção 2)
var token = await _viewer.OpenDocumentAsync(
path,
new Doconut.PdfConfig { AllowSearch = true },
new DocOptions(),
CancellationToken.None);
ViewBag.Token = token;
ViewBag.BasePath = "doconut"; // corresponde ao ramo do middleware
ViewBag.ResPath = "doconut-res/images";// recursos incorporados
return View();
}
private readonly Doconut.Viewer _viewer;
public FileController(Doconut.Viewer viewer) => _viewer = viewer;
}
O controlador faz três coisas:
- Index – lê a pasta
App_Data/Docse passa os nomes dos arquivos para uma view. - Download / Delete – ações MVC padrão que utilizam o helper
PhysicalFileembutido. - ViewPdf – abre o PDF selecionado com a Doconut, recebe um token de segurança e o passa para uma view Razor.
2. Configure o Estado de Sessão e os Serviços da Doconut
O visualizador da Doconut depende do estado de sessão do ASP.NET para proteger o token que identifica um documento. Adicione os serviços necessários em Program.cs (ou Startup.cs para projetos .NET 6):
var builder = WebApplication.CreateBuilder(args);
// Serviços MVC
builder.Services.AddControllersWithViews();
// Cache de sessão – necessário para validação do token
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession();
// Registro da Doconut – aponte para seu arquivo de licença
builder.Services.AddDoconut(options =>
{
options.LicensePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
options.MiddlewarePath = "/doconut";
options.ResourcesPath = "/doconut-res";
options.UnsafeMode = false; // manter a segurança padrão
});
var app = builder.Build();
// A sessão deve ser iniciada antes do middleware do visualizador
app.UseSession();
// O middleware da Doconut deve ser mapeado para o caminho configurado acima.
// Consulte a documentação da Doconut para a chamada de mapeamento exata (ex., app.Map("/doconut", …)).
app.UseRouting();
app.UseEndpoints(endpoints => endpoints.MapDefaultControllerRoute());
app.Run();
Pontos chave:
AddDistributedMemoryCachefornece o armazenamento em memória que oAddSessionprecisa.UseSession()deve aparecer antes do middleware da Doconut; caso contrário, você verá o erro de tempo de execução “Session middleware not configured.”MiddlewarePatheResourcesPathsão strings de coordenação – o ramo real do middleware deve corresponder ao caminho que você configurar.
3. Criar a Visualização do Gerenciador de Arquivos
Crie Views/File/Index.cshtml. Ele lista arquivos e fornece ações para download, exclusão e visualização de 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>
Quando o usuário clica em View PDF, a ação ViewPdf cria um token e retorna uma segunda visualização que hospeda o widget do visualizador.
4. Renderizar o Visualizador Doconut
Crie Views/File/ViewPdf.cshtml. A página precisa apenas de um elemento contêiner; o widget JavaScript é carregado a partir dos recursos incorporados.
@{
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>
O widget lê o AccessToken que você forneceu, contata o endpoint /doconut/DocImage.axd e transmite cada página como uma imagem. Como o token está vinculado à sessão ASP.NET atual, um usuário não pode copiar a URL e visualizar o documento em outro navegador sem o mesmo cookie de sessão.
5. Lidando com a Expiração do Token e Segurança
O tempo limite padrão do token do Doconut é de 60 minutos (configurável via DocOptions.TimeOut). Se o visualizador receber “Document session not found” ou “You Are Not Authorized To View This Page”, a sessão expirou ou a solicitação está vindo de um contexto de navegador diferente.
Remédios típicos:
- Atualizar a página – o controlador gerará um token novo.
- Aumentar o tempo limite – passe um
DocOptionspersonalizado ao abrir o documento:
var options = new DocOptions { TimeOut = TimeSpan.FromHours(2) };
var token = await _viewer.OpenDocumentAsync(
path,
new Doconut.PdfConfig { AllowSearch = true },
options,
CancellationToken.None);
- Configurações cross‑origin – garanta que o atributo
SameSiteno cookie de sessão seja compatível com o domínio do seu front‑end. O padrãoLaxfunciona na maioria dos portais de mesma origem.
6. Estendendo o Gerenciador (Opcional)
O gerenciador de arquivos principal já está funcional, mas você pode querer adicionar:
- Upload – um formulário simples que envia um
IFormFilee o salva em_root. - Navegação de pastas – modifique a ação
Indexpara aceitar um caminho relativo e protegê‑lo contra travessia de diretórios (Path.GetFullPath+ verificaçãoStartsWith(_root)). - Busca – filtre
filespor nome antes de enviá‑los para a visualização.
Todas essas extensões permanecem dentro do mesmo padrão MVC e continuam a se beneficiar do mesmo visualizador Doconut protegido por sessão.
7. O Que Você Conseguiu
- Um gerenciador de arquivos ASP.NET MVC gratuito – sem bibliotecas de UI de terceiros, sem taxas de licenciamento.
- Renderização de PDF no navegador via visualizador universal da Doconut, evitando a necessidade de instalações do Office ou Adobe no cliente.
- Acesso seguro baseado em token que utiliza o estado de sessão do ASP.NET, impedindo o compartilhamento arbitrário de URLs.
- Uma única base de código que funciona para .NET 6 e .NET 8 e pode ser portada para Razor Pages ou APIs mínimas com apenas as chamadas de registro (
AddDoconut,UseSession) sendo alteradas.
Implante o aplicativo no IIS, Azure App Service ou Docker – a mesma configuração Program.cs funciona em qualquer lugar porque a Doconut roda em .NET 6+ e não requer componentes nativos do Office.