web-dev-qa-db-fra.com

Request.Files dans ASP.NET CORE

J'essaye de télécharger des fichiers en utilisant aspnet core en utilisant une requête ajax. Dans les versions précédentes de .net, j’avais l'habitude de gérer cela avec 

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

                fName = file.FileName;
     (...)

mais maintenant son erreur montrant à request.files, comment puis-je le faire fonctionner? J'ai cherché et trouvé que httppostedfile a été changé pour iformfile mais comment gérer request.files?

13
Ironsun

C'est le code de travail d'un projet récent. Les données ont été déplacées de Request.Files à Request.Form.Files . Si vous avez besoin de convertir un flux de données en tableau d'octets, c'est la seule implémentation qui a fonctionné pour moi. D'autres retourneraient un tableau vide.

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

Ce code fonctionne à 100% pour les fichiers téléchargés en utilisant un formulaire standard ou un fichier 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;
}
1
Dmitry Sikorsky

Qu'en est-il de cette fusion de deux bonnes solutions que j'ai trouvées: 

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