it-swarm.com.de

Request.Files in ASP.NET CORE

Ich versuche, Dateien mit Aspnet Core mit Ajax Request hochzuladen. In früheren Versionen von .net habe ich dies mit verwendet 

 foreach (string fileName in Request.Files)
            {
                HttpPostedFileBase file = Request.Files[fileName];
                //Save file content goes here

                fName = file.FileName;
     (...)

aber jetzt zeigt es einen Fehler bei request.files wie kann ich es zum Laufen bringen? Ich habe gesucht und festgestellt, dass httppostedfile in iformfile geändert wurde, aber wie werden request.files behandelt?

13
Ironsun

Dies ist der Arbeitscode aus einem aktuellen Projekt. Daten wurden von Request.Files nach Request.Form.Files . Verschoben. Falls Sie Stream in Byte-Array konvertieren müssen, ist dies die einzige Implementierung, die für mich funktioniert hat. Andere würden ein leeres Array zurückgeben.

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

Dieser Code funktioniert zu 100% für beide Dateien, die mit normalem Formular oder Ajax hochgeladen werden:

[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;
}
1
Dmitry Sikorsky

Was ist mit dieser Fusion aus zwei guten Lösungen, die ich hergebracht habe: 

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();
  }
}
0
Carl Verret