Asp.Net Core WebApi: Dwonload e Upload di files

La maggior parte delle volte le Web API vengono implementate per scambiare informazioni in formato JSON, XML o di un qualsiasi altro formatter che avete implementato nel vostro programma.
Capita anche spesso però che una parte di questo scambio sia anche un file.
Dare quindi la possibilità al vostro “chiamante” sia di scaricare un file, sia quella di fare l’upload.

La differenza fra ASP.NET e ASP.NET Core è minima, ma vediamo come potete implementarla velocemente con questo esempio di codice che trovate alla fine dell’articolo.

Innanzitutto il vostro controller potete farlo derivare dalla classe ControllerBase invece di quella di default in cui c’è tutta la parte di MVC che al momento non vi interessa.
Per recuperare un file dal vostro server sicuramente dovete fare una chiamata in Get e, nell’esempio, gli dovete passare un nome del file.
Molto semplicemente dovete recuperare lo stream di byte del vostro file da file system o da un blob storage o in qualsiasi altro posto abbiate deciso di archiviare i file.
A questo punto come tipo di ritorno della vostra funzione potete usare File che accetta come parametri il vostro memory stream appena caricato e il MimeType dello stesso.
Per recuperare il MimeType in base all’estensione del file, potete usare un pacchetto NuGet chiamato MediaTypeMap che è praticamente un dizionario di tutti i MimeType.
Potete trovare le informazioni di questo pacchetto qua: https://www.nuget.org/packages/MediaTypeMap

La parte di upload è relativamente semplice come quella di download.
In ASP.NET Core esiste un tipo di parametro nuovo in ingresso che si chiama IFormFile che permette appunto di fare upload di file.

Questo oggetto ha un metodo che si chiama CopyToAsync che potete usare per recuperare lo stream del file appena inviato e copiarlo su file system oppure, come per il download, con il metodo di archiviazione che avete implementato nella vostra applicazione.

    [Route("api/[controller]")]
    public class FilesController : ControllerBase
    {
        [HttpGet]
        public async Task<IActionResult> Download(string filename)
        {
            if (filename == null)
                return Content("filename not present");

            var path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "download", filename);

            var memory = new MemoryStream();
            using (var stream = new FileStream(path, FileMode.Open))
            {
                await stream.CopyToAsync(memory);
            }
            memory.Position = 0;

            return File(memory, MimeTypeMap.GetMimeType(Path.GetExtension(path)), Path.GetFileName(path));
        }

        [HttpPost]
        public async Task<IActionResult> Upload(IFormFile uploadedFile)
        {
            if (uploadedFile == null || uploadedFile.Length == 0)
                return Content("file not selected");

            var path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", uploadedFile.FileName);

            using (var stream = new FileStream(path, FileMode.Create))
            {
                await uploadedFile.CopyToAsync(stream);
            }

            return Ok();
        }
    }

Torna su
Categoria

C# (940)


Autore

https://www.emanuelebartolesi.com/asp-net-core-webapi-download-upload-files/


Data pubblicazione

14/03/2020