Request.Files in ASP.NET CORE Request.Files in ASP.NET CORE ajax ajax

Request.Files in ASP.NET CORE


This is working code from a recent project. Data has been moved from Request.Files to Request.Form.Files.In case you need to convert stream to byte array - this is the only implementation that worked for me. Others would return empty array.

using System.IO;var filePath = Path.GetTempFileName();foreach (var formFile in Request.Form.Files){   if (formFile.Length > 0)   {      using (var inputStream = new FileStream(filePath, FileMode.Create))      {         // read file to stream         await formFile.CopyToAsync(inputStream);         // stream to byte array         byte[] array = new byte[inputStream.Length];         inputStream.Seek(0, SeekOrigin.Begin);         inputStream.Read(array, 0, array.Length);         // get file name         string fName = formFile.FileName;      }   }}


What about this merge from two good solutions I came around :

var myBytes  = await GetByteArrayFromImageAsync(Request.Form.Files[0]); private async Task<byte[]> GetByteArrayFromImageAsync(IFormFile file){  using (var target = new MemoryStream())  {    await file.CopyToAsync(target);    return target.ToArray();  }}


This code works for 100% for both files uploaded using regular form or ajax:

[HttpPost]public async Task<IActionResult> Upload(IList<IFormFile> files){  foreach (IFormFile source in files)  {    string filename = ContentDispositionHeaderValue.Parse(source.ContentDisposition).FileName.Trim('"');    filename = this.EnsureCorrectFilename(filename);    using (FileStream output = System.IO.File.Create(this.GetPathAndFilename(filename)))      await source.CopyToAsync(output);  }  return this.RedirectToAction("Index");}private string EnsureCorrectFilename(string filename){  if (filename.Contains("\\"))    filename = filename.Substring(filename.LastIndexOf("\\") + 1);  return filename;}private string GetPathAndFilename(string filename){  return this.HostingEnvironment.WebRootPath + "\\files\\" + filename;}