web-dev-qa-db-ja.com

ASP.NET COREのRequest.Files

私はajaxリクエストを使用してaspnetコアを使用してファイルをアップロードしようとしています。以前のバージョンの.netでは、これを使用してこれを処理していました

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

                fName = file.FileName;
     (...)

しかし、request.filesでエラーが表示されるようにするにはどうすればよいですか? httppostedfileがiformfileに変更されているのを検索して見つけましたが、request.filesの処理方法は?

18
Ironsun

これは最近のプロジェクトからの作業コードです。データはRequest.FilesからRequest.Form.Filesに移動されました。ストリームをバイト配列に変換する必要がある場合-これは私のために働いた唯一の実装です。その他は空の配列を返します。

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

私が出会った2つの良い解決策からのこのマージはどうですか?

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

このコードは、通常のフォームまたはajaxを使用してアップロードされた両方のファイルで100%機能します。

[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