NET 7 -  Mininal APIs : Upload de arquivos


   Enviar arquivos usando minimal APIs agora ficou muito simples. Acompanhe...

As mininal Apis foram introduzida no .NET 6 e agora parece que esta recebendo o acabamento final com a introdução de novos recursos que estavam faltando. Um deles é o FileUpload ou envio de arquivos.

Criar endpoints usando o novo recurso das Mininal APis é ótimo para iniciantes, ou para criar endpoints enxutos para microsserviços. Mas elas podem melhorar e é isso que ocorre com os novos recursos das Minimal APIs no .NET 7.

Hoje vamos apresentar o novo recurso FileUpload incluído nas Minimal APIs.

Agora para fazer o Upload de um arquivo basta mapear um endpoint POST recebendo um IFormFile. Se desejar enviar mais de um arquivo de uma vez só basta usar IFormCollection.

Como exemplo vamos criar uma minimal API no VS 2022 preview para ilustrar.

Recursos usados :

Criando o projeto no VS 2022

Abra o VS 2022 preview e clique em Create a New Project selecionando o template ASP.NET Core Web API” :

Informe o nome Api_Upload;

A seguir defina as demais configurações conforme mostrada na imagem a seguir:

Ao clicar em Create teremos a minimal API criada.

Vamos alterar o código gerado pelo template criando um novo endpoint onde vamos aplicar um filtro usando o novo recurso :


app.MapPost(
"/upload", async (IFormFile arquivo) =>
{
  
await arquivo.CopyToAsync(File.OpenWrite($@"{DateTime.Now.Ticks}.txt"));
});
 

- CopyToAsync lê de forma assíncrona os bytes do stream atual e os grava em outro strem;

IFormFile representa um arquivo enviado com o HttpRequest e contém informações sobre o arquivo enviado como : ContentType, tamanho do arquivo, etc;

- File.OpenWrite abre um arquivo existente ou cria um novo arquivo para gravação.

- $@"{DateTime.Now.Ticks}.txt"vai gerar um nome de arquivo com a extensão .txt

outra opção seria usar $@"{Guid.NewGuid()}.txt") isso vai gerar nomes de arquivos mais longos.

Executando o projeto teremos os endpoints exibidos no Swagger:

Acionando o endpoint  POST /upload teremos:

Ao pressionarmos o botão Procurar será aberta uma janela para selecioinar o arquivo a ser enviado.

Após enviar o arquivo podemos conferir na raiz do projeto os arquivos enviados:

Uma forma mais robusta de fazer esta implementação para um e também para mais de um arquivos seria implementar os seguintes endpoints:

app.MapPost("/uploadArquivo", async (IFormFile arquivo) =>
{
    string tempfile = CreateTempfilePath();
    using var stream = File.OpenWrite(tempfile);
    await arquivo.CopyToAsync(stream);

    return Results.Ok("Arquivo enviado com sucesso");

    //await arquivo.CopyToAsync(File.OpenWrite($@"{DateTime.Now.Ticks}.txt"));
});

app.MapPost("/uploadArquivos", async (IFormFileCollection arquivos) =>
{
    foreach (var file in arquivos)
    {
        string tempfile = CreateTempfilePath();
        using var stream = File.OpenWrite(tempfile);
        await file.CopyToAsync(stream);
    }
    return Results.Ok("Arquivos enviados com sucesso");
});

static string CreateTempfilePath()
{
    var filename = $@"{DateTime.Now.Ticks}.tmp";

    var directoryPath = Path.Combine("temp", "uploads");

    if (!Directory.Exists(directoryPath))
        Directory.CreateDirectory(directoryPath);

    return Path.Combine(directoryPath, filename);
}

O primeiro vai permitir enviar um arquivo por vez usando IFormFile enquanto que o segundo vai permitir selecionar mais de um arquivo e enviá-los de um só vez usando IFormFileCollection.

Aqui também estamos usando o método CreateTempFilePath() para criar o nome do arquivo usando Ticks do DateTime e criar a pasta temp/uploads no servidor para salvar os arquivos enviados.

Abaixo temos a exibição para o endpoint que envia mais de uma arquivo :

E estamos conversados...

Pegue o projeto aqui : Api_Upload.zip

"como está escrito: Não há justo, nem um sequer, não há quem entenda, não há quem busque a Deus;
todos se extraviaram, à uma se fizeram inúteis; não há quem faça o bem, não há nem um sequer."
Romanos 3:10-12

Referências:


José Carlos Macoratti