One task of mine includes uploading file in ASP.NET Core 5
. Last time I did file upload in ASP.NET
, I did it with IFormFile
. However, this time I preferred to make a research if anything is changed so far. I came to sample code from Microsoft which is based a non-argument action. I copied the MS to following sample and put an IFromFile
sample besides it to be referenced together.
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.WebUtilities; using Microsoft.Net.Http.Headers; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; namespace upload.Controllers { [ApiController] public class UploaderController : ControllerBase { [HttpPost] [Route("UploadModelBinding")] public async Task<IActionResult> UploadModelBinding(ICollection<IFormFile> files) { //model binding or model validation try { long size = files.Sum(f => f.Length); var fileName = Path.GetRandomFileName(); var saveToPath = Path.Combine(Path.GetTempPath(), fileName); foreach (var formFile in files) { if (formFile.Length > 0) { using (var stream = new FileStream(saveToPath, FileMode.Create)) { await formFile.CopyToAsync(stream); } } } return Ok(new { count = files.Count, fileName, size, saveToPath }); } catch (Exception exp) { return BadRequest("Exception generated when uploading file - " + exp.Message); } } [HttpPost] [Route("UploadNoArg")] public async Task<IActionResult> UploadNoArg() { //no-argument action var request = HttpContext.Request; if (!request.HasFormContentType || !MediaTypeHeaderValue.TryParse(request.ContentType, out var mediaTypeHeader) || string.IsNullOrEmpty(mediaTypeHeader.Boundary.Value)) { return new UnsupportedMediaTypeResult(); } var reader = new MultipartReader(mediaTypeHeader.Boundary.Value, request.Body); var section = await reader.ReadNextSectionAsync(); while (section != null) { var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out var contentDisposition); if (hasContentDispositionHeader && contentDisposition.DispositionType.Equals("form-data") && !string.IsNullOrEmpty(contentDisposition.FileName.Value)) { var fileName = Path.GetRandomFileName(); var saveToPath = Path.Combine(Path.GetTempPath(), fileName); using (var targetStream = System.IO.File.Create(saveToPath)) { await section.Body.CopyToAsync(targetStream); } return Ok(); } section = await reader.ReadNextSectionAsync(); } return BadRequest("No files data in the request."); } } }
I tested both methods using Postman. Both use form-data
and an entry of type file
. The only difference is that the model binding
method requires that the entry to be named files
. Consider that one methods is using model binding or model validation and another one is using no-argument action technique.
Top comments (0)