ASP.NET CORE 中的 Request.Files

Posted

技术标签:

【中文标题】ASP.NET CORE 中的 Request.Files【英文标题】:Request.Files in ASP.NET CORE 【发布时间】:2016-08-08 07:02:21 【问题描述】:

我正在尝试使用 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怎么处理呢?

【问题讨论】:

看看这些链接***.com/questions/26443305/…和***.com/questions/29836342/mvc-6-httppostedfilebase尤其是这个答案***.com/a/27980038/5426333 感谢您的评论,我实际上发现IFormFile file in Request.Form.Files 现在我被困在获取参数值 Request.Form.Files[fileName] ? 【参考方案1】:

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

【讨论】:

【参考方案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();
  

【讨论】:

【参考方案3】:

对于使用常规格式或 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;

【讨论】:

以上是关于ASP.NET CORE 中的 Request.Files的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Core 中的静态文件

ASP.NET Core 2.0中的HttpContext

Asp.Net Core 中的静态文件

详解Asp.Net Core中的Cookies

ASP.NET Web API 与 ASP.NET Core 中的 URL 匹配差异

如何仅为 ASP.NET 5 (ASP.NET Core) 中的受保护操作添加令牌验证