Gerenciador de Arquivos ASP.NET MVC Gratuito com Visualizador de PDF Integrado
← Back to Blog••6 min read

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:

  1. Index – lê a pasta App_Data/Docs e passa os nomes dos arquivos para uma view.
  2. Download / Delete – ações MVC padrão que utilizam o helper PhysicalFile embutido.
  3. 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:

  • AddDistributedMemoryCache fornece o armazenamento em memória que o AddSession precisa.
  • UseSession() deve aparecer antes do middleware da Doconut; caso contrário, você verá o erro de tempo de execução “Session middleware not configured.”
  • MiddlewarePath e ResourcesPath sã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 DocOptions personalizado 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 SameSite no cookie de sessão seja compatível com o domínio do seu front‑end. O padrão Lax funciona 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 IFormFile e o salva em _root.
  • Navegação de pastas – modifique a ação Index para aceitar um caminho relativo e protegê‑lo contra travessia de diretórios (Path.GetFullPath + verificação StartsWith(_root)).
  • Busca – filtre files por 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.

#ASP.NET MVC#File Manager#PDF Viewer#.NET#Doconut#Gerenciador de Arquivos#Visualizador de PDF