fore.for Request.Files

Oma*_*mar 67 c# asp.net file-upload

我正在尝试在ASP.NET MVC中上传多个文件,我在我的控制器中有这个简单的foreach循环

foreach (HttpPostedFileBase f in Request.Files)
{
    if (f.ContentLength > 0)
        FileUpload(f);
}
Run Code Online (Sandbox Code Playgroud)

以前的代码生成此错误:

Unable to cast object of type 'System.String' to type 'System.Web.HttpPostedFile'. 
Run Code Online (Sandbox Code Playgroud)

我不明白的是为什么Request.Files [1]返回一个HttpPostedFileBase但是当迭代它时,它返回字符串(可能是文件名).

注意:我知道这可以用for循环解决.此外,我尝试使用HttpPostedFile,同样的错误.

tva*_*son 100

枚举器HttpFileCollection返回文件的键(名称),而不是HttpPostedFileBase对象.获得密钥后,使用带有键(filename)的Item([])属性来获取HttpPostedFileBase对象.

foreach (string fileName in Request.Files)
{
    HttpPostedFileBase file = Request.Files[fileName];

    ...
}
Run Code Online (Sandbox Code Playgroud)


ngu*_*890 32

使用我的标签HTML是:

<input class="valid" id="file" name="file" multiple="" type="file">
Run Code Online (Sandbox Code Playgroud)

Request.Files将在数组中具有重复的名称.所以你应该像这样解决:

for (int i = 0; i < Request.Files.Count; i++ ){
    HttpPostedFileBase fileUpload = Request.Files[i];
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案,因为您应该能够使用`file.FileName`获取文件名.如果使用`foreach`进行并且名称重复,则第一个文件将被多次保存 (4认同)

Aki*_*oto 10

我们可以使用LINQ来执行此操作,并仍然按照要求使用foreach:

var files = Enumerable.Range(0, Request.Files.Count)
    .Select(i => Request.Files[i]);

foreach (var file in files)
{
    // file.FileName
}
Run Code Online (Sandbox Code Playgroud)

正如@tvanfosson所说,枚举器将文件名作为字符串返回,而不是HttpPostedFileBase.此方法HttpPostedFileBase this[string name]返回我们想要的对象.如果HttpFileCollectionBase实施,IEnumerable<HttpPostedFileBase>那么我们可以正常地做foreach.但是,它实现了非泛型IEnumerable.


Joe*_*one 6

您可以尝试迭代字符串并将它们转换为HttpPostedFile,如下所示:

foreach (string file in Request.Files)
    {
        HttpPostedFile hFile = Request.Files[file] as HttpPostedFile;
        if (hFile.ContentLength > 0)
            FileUpload(hFile);
    }
Run Code Online (Sandbox Code Playgroud)

  • 不能隐式地将HttpPostedFileBase转换为HttpPostedFile (2认同)

Har*_*vey 6

不幸的是,tvanfosson 的回答对我不起作用。虽然文件上传得很好,不会抛出错误,但会出现一个问题,只使用一个文件,所以同一个文件会保存两次,而不是同时使用它们。

循环遍历 Request.Files 中每个文件的名称的 foreach 语句似乎有问题,出于某种原因,它对我来说不是一个键,每次只会选择第一个文件。

HttpFileCollectionBase files = Request.Files;

for(var i = 0; i < files.Count; i++)
{
    HttpPostedFileBase file = files[i];

    ...
}
Run Code Online (Sandbox Code Playgroud)


小智 6

以下代码对我有用。

  HttpResponseMessage result = null;
  var httpRequest = System.Web.HttpContext.Current.Request;
  HttpFileCollection uploadFiles = httpRequest.Files;
  var docfiles = new List<string>();

  if (httpRequest.Files.Count > 0){
      int i;
      for (i = 0; i < uploadFiles.Count; i++) {
          HttpPostedFile postedFile = uploadFiles[i];
          var filePath = @"C:/inetpub/wwwroot/test1/reports/" + postedFile.FileName;
          postedFile.SaveAs(filePath);
          docfiles.Add(filePath);
      }
      result = Request.CreateResponse(HttpStatusCode.Created, docfiles);
  } else {
      result = Request.CreateResponse(HttpStatusCode.BadRequest);
  }

  return result;
}
Run Code Online (Sandbox Code Playgroud)