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;}