ASP.NET核心中的Request.Files

ASP.NET核心中的Request.Files,asp.net,ajax,file,upload,asp.net-core,Asp.net,Ajax,File,Upload,Asp.net Core,我正在尝试使用AspnetCore和ajax请求上传文件。 在以前的.net版本中,我使用 foreach (string fileName in Request.Files) { HttpPostedFileBase file = Request.Files[fileName]; //Save file content goes here fName = file.Fil

我正在尝试使用AspnetCore和ajax请求上传文件。 在以前的.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?

此代码100%适用于使用常规表单或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;
}
[HttpPost]
公共异步任务上载(IList文件)
{
foreach(文件中的文件源)
{
string filename=ContentDispositionHeaderValue.Parse(source.ContentDisposition.filename.Trim(“”);
filename=this.EnsureCorrectFilename(文件名);
使用(FileStream output=System.IO.File.Create(this.GetPathAndFilename(filename)))
等待source.CopyToAsync(输出);
}
返回此.RedirectToAction(“索引”);
}
私有字符串文件名(字符串文件名)
{
if(filename.Contains(“\\”)
filename=filename.Substring(filename.LastIndexOf(“\\”)+1);
返回文件名;
}
私有字符串GetPathAndFilename(字符串文件名)
{
返回this.HostingEnvironment.WebRootPath+“\\files\\”+文件名;
}

这是最近项目中的工作代码。数据已从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;
      }
   }
}

从我找到的两个好的解决方案来看,这次合并如何:

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();
  }
}
var myBytes=wait GetByteArrayFromImageAsync(Request.Form.Files[0]);
专用异步任务GetByteArrayFromImageAsync(IFormFile)
{
使用(var target=new MemoryStream())
{
等待文件.CopyToAsync(目标);
返回target.ToArray();
}
}

看看这些链接,尤其是这个答案谢谢你的评论,我实际上在Request.Form.Files中找到了
ifformfile文件
现在我在获取参数值方面遇到了困难
Request.Form.Files[fileName]