【问题标题】:Request.Files in ASP.NET COREASP.NET CORE 中的 Request.Files
【发布时间】: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怎么处理呢?

【问题讨论】:

标签: asp.net ajax file upload asp.net-core


【解决方案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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        • 2014-07-14
        • 2013-07-17
        • 2014-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多