O ASP.NET Core revolucionou a forma como construímos aplicações web, e uma das suas características mais notáveis é o modelo de hospedagem simplificado, as chamadas Minimal APIs. Elas permitem criar APIs leves com o mínimo de dependências, agilizando o desenvolvimento e a implantação. Já exploramos diversos aspectos das Minimal APIs, desde caching em memória até autenticação JWT e testes. Hoje, vamos mergulhar em um tópico essencial: o upload de arquivos.
Preparando o Terreno: Criando um Projeto ASP.NET Core Web API
Para começar, você precisará do Visual Studio 2022 instalado. Este ambiente de desenvolvimento integrado (IDE) da Microsoft oferece todas as ferramentas necessárias para criar, depurar e implantar aplicações ASP.NET Core. Caso ainda não o tenha, baixe-o aqui.
Com o Visual Studio 2022 instalado, siga estes passos para criar um novo projeto:
- Inicie o Visual Studio 2022.
- Clique em “Criar um novo projeto”.
- Na janela “Criar um novo projeto”, selecione “ASP.NET Core Web API” na lista de modelos.
- Clique em “Próximo”.
- Na janela “Configurar seu novo projeto”, especifique o nome e o local do novo projeto.
- Clique em “Próximo”.
- Na janela “Informações adicionais”, selecione “.NET 9.0 (Standard Term Support)” como a versão da estrutura e desmarque a caixa de seleção que diz "Usar controladores", pois estaremos usando APIs mínimas neste projeto.
- Clique em “Criar”.
Este projeto servirá como base para os exemplos de código que veremos a seguir.
IFormFile e IFormFileCollection: As Ferramentas para Upload
As versões mais recentes do ASP.NET Core simplificaram o upload de arquivos com as interfaces IFormFile
e IFormFileCollection
. A primeira é ideal para lidar com o upload de um único arquivo, enquanto a segunda permite o envio de múltiplos arquivos de uma só vez.
Aqui está um exemplo de como usar IFormFile
para receber um arquivo:
app.MapPost("/upload", async (IFormFile file) =>
{
var tempFile = Path.GetTempFileName();
using var fileStream = File.OpenWrite(tempFile);
await file.CopyToAsync(fileStream);
});
Neste código, o arquivo enviado é salvo em um arquivo temporário no servidor. A função File.OpenWrite
cria um FileStream
, que permite a escrita de dados no arquivo. O método CopyToAsync
copia o conteúdo do arquivo recebido para o FileStream
.
Para lidar com múltiplos arquivos, utilize IFormFileCollection
:
app.MapPost("/upload_multiple_files", async (IFormFileCollection files) =>
{
foreach (var file in files)
{
var tempFile = Path.GetTempFileName();
using var fileStream = File.OpenWrite(tempFile);
await file.CopyToAsync(fileStream);
}
});
Este código itera sobre a coleção de arquivos e os salva individualmente em arquivos temporários.
Além do Upload: Manipulando o Conteúdo dos Arquivos
Em muitos casos, não basta apenas receber o arquivo. Precisamos processar seu conteúdo. Para isso, podemos usar a classe StreamReader
, que facilita a leitura de caracteres de um fluxo de bytes.
Imagine que você precisa importar dados de autores de um arquivo de texto para um banco de dados. Cada linha do arquivo representa um autor. O código abaixo demonstra como fazer isso:
app.MapPost("/author/upload", (IFormFile file,
[FromServices] IAuthorRepository authorRepository) =>
{
using var streamReader = new StreamReader(file.OpenReadStream());
while (streamReader.Peek() >= 0)
authorRepository.Create(streamReader.ReadLine() ?? string.Empty);
});
Este código lê o arquivo linha por linha e usa um repositório (IAuthorRepository
) para criar um novo autor no banco de dados. A StreamReader é uma ferramenta muito útil para arquivos de texto.
Protegendo suas APIs: Lidando com Erros Antifalsificação
Ao trabalhar com upload de arquivos, é comum encontrar erros de antifalsificação. O ASP.NET Core utiliza esses mecanismos para proteger contra ataques de falsificação de solicitação entre sites (CSRF). Esses ataques podem comprometer a segurança de sua aplicação, permitindo que um invasor execute ações em nome de um usuário autenticado.
Se você tem certeza de que um endpoint é seguro e não requer proteção antifalsificação, você pode desativar a validação usando o método DisableAntiforgery
:
app.MapPost("/upload", async (IFormFile file) =>
{
var tempFile = Path.GetTempFileName();
using var fileStream = File.OpenWrite(tempFile);
await file.CopyToAsync(fileStream);
}).DisableAntiforgery();
Em cenários que exigem proteção antifalsificação, a solução é passar tokens antifalsificação nos cabeçalhos das requisições. O processo envolve:
- Registrar os serviços necessários para trabalhar com tokens antifalsificação.
- Gerar tokens antifalsificação a cada resposta.
- Enviar o token antifalsificação com cada requisição.
Registrando os Serviços Antifalsificação
Adicione os serviços antifalsificação à sua coleção de serviços no arquivo Program.cs
:
builder.Services.AddAntiforgery();
Em seguida, adicione os serviços antifalsificação ao pipeline de processamento de requisições:
app.UseAntiforgery();
Gerando um Token Antifalsificação
Utilize o método GetAndStoreTokens
da interface IAntiforgery
para gerar um token antifalsificação. Passe uma referência ao contexto HTTP atual como parâmetro:
app.MapGet("/generate-antiforgery-token", (IAntiforgery antiforgery, HttpContext context) =>
{
var antiForgeryTokenSet = antiforgery.GetAndStoreTokens(context);
var xsrfToken = antiForgeryTokenSet.RequestToken!;
return Results.Ok(new { token = xsrfToken });
});
Passando o Token Antifalsificação no Cabeçalho da Requisição
Utilize um cliente REST ou HTTP (como o Postman) para invocar o endpoint que gera o token na resposta HTTP. Em cada requisição POST subsequente, envie o token no cabeçalho para evitar erros de violação antifalsificação.
Considerações Finais
Dominar o upload de arquivos com Minimal APIs no ASP.NET Core é fundamental para criar aplicações web modernas e eficientes. As Minimal APIs oferecem uma abordagem simplificada e poderosa para construir APIs, permitindo que você se concentre na lógica de negócios da sua aplicação. Além disso, implementar mecanismos de proteção antifalsificação é crucial para garantir a segurança e a integridade de suas APIs.
No entanto, é importante ter cautela ao usar tokens antifalsificação em ambientes com balanceamento de carga, pois cada servidor pode ter suas próprias chaves de proteção de dados. Nesses casos, é necessário configurar chaves de proteção de dados compartilhadas para garantir que os tokens possam ser validados em todos os servidores. Para mais informações sobre segurança em aplicações ASP.NET Core, consulte a documentação oficial da Microsoft.