Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# foreach on Request.Files_C#_Asp.net_File Upload - Fatal编程技术网

C# foreach on Request.Files

C# foreach on Request.Files,c#,asp.net,file-upload,C#,Asp.net,File Upload,我正在尝试在ASP.NET MVC中上载多个文件,我的控制器中有一个简单的foreach循环 foreach (HttpPostedFileBase f in Request.Files) { if (f.ContentLength > 0) FileUpload(f); } 前面的代码生成此错误: Unable to cast object of type 'System.String' to type 'System.Web.HttpPostedFile'.

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

foreach (HttpPostedFileBase f in Request.Files)
{
    if (f.ContentLength > 0)
        FileUpload(f);
}
前面的代码生成此错误:

Unable to cast object of type 'System.String' to type 'System.Web.HttpPostedFile'. 
我不明白的是,为什么Request.Files[1]返回HttpPostedFileBase,但当它被迭代时,它返回字符串(可能是文件名)

注意:我知道这可以用for循环解决。
此外,我还尝试使用HttpPostedFile,但出现了相同的错误。

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

foreach (string file in Request.Files)
    {
        HttpPostedFile hFile = Request.Files[file] as HttpPostedFile;
        if (hFile.ContentLength > 0)
            FileUpload(hFile);
    }
for (int i = 0; i < Request.Files.Count; i++ ){
    HttpPostedFileBase fileUpload = Request.Files[i];
foreach (var obj in fileCollection)
{
    HttpPostedFile file = fileCollection.Get(obj.ToString());
}

HttpFileCollection
上的枚举器返回文件的键(名称),而不是
HttpPostedFileBase
对象。获得密钥后,将
[]
)属性与密钥(文件名)一起使用,以获取
HttpPostedFileBase
对象

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

    ...
}

不幸的是,tvanfosson的回答对我不起作用。虽然这些文件可以很好地上传,并且不会抛出错误,但如果只使用其中一个文件,则会出现问题,因此同一个文件将保存两次,而不是同时使用两个文件

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

HttpFileCollectionBase files = Request.Files;

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

    ...
}
HttpFileCollectionBase files=Request.files;
对于(var i=0;i
带我的标签的HTML是:

<input class="valid" id="file" name="file" multiple="" type="file">

请求。文件在数组中的名称将重复。所以你应该这样解决:

foreach (string file in Request.Files)
    {
        HttpPostedFile hFile = Request.Files[file] as HttpPostedFile;
        if (hFile.ContentLength > 0)
            FileUpload(hFile);
    }
for (int i = 0; i < Request.Files.Count; i++ ){
    HttpPostedFileBase fileUpload = Request.Files[i];
foreach (var obj in fileCollection)
{
    HttpPostedFile file = fileCollection.Get(obj.ToString());
}
for(int i=0;i
以下代码对我有效

  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;
}
httpresponsemessageresult=null;
var httpRequest=System.Web.HttpContext.Current.Request;
HttpFileCollection uploadFiles=httpRequest.Files;
var docfiles=新列表();
如果(httpRequest.Files.Count>0){
int i;
对于(i=0;i
我们可以使用LINQ来实现这一点,但仍可以按要求使用foreach:

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

foreach (var file in files)
{
    // file.FileName
}

正如@tvanfosson所说,枚举器以字符串形式返回文件名,而不是
HttpPostedFileBase
。此方法
HttpPostedFileBase此[string name]
返回所需的对象。如果
HttpFileCollectionBase
实现了
IEnumerable
,那么我们可以正常执行foreach。但是,它实现了一个非通用的
IEnumerable
您可以使用
foreach
HttpFileCollection
中获取
HttpPostedFile
,如下所示:

foreach (string file in Request.Files)
    {
        HttpPostedFile hFile = Request.Files[file] as HttpPostedFile;
        if (hFile.ContentLength > 0)
            FileUpload(hFile);
    }
for (int i = 0; i < Request.Files.Count; i++ ){
    HttpPostedFileBase fileUpload = Request.Files[i];
foreach (var obj in fileCollection)
{
    HttpPostedFile file = fileCollection.Get(obj.ToString());
}

有没有办法让它返回HttpPostedFile呢?据我所知没有。它派生自NameObjectCollectionBase,该类的枚举器迭代键。编译器为我抛出一个错误,希望我使用
HttpPostedFileBase
,而不是
HttpPostedFile
@tvanfosson。在我的情况下,fileName总是变成“Image”,但当我说Request.Files[0].FileName它给出了正确的名称你知道吗?我使用的是MVC5。@Geethanga-关键的“名称”是HTML文件输入标记上的名称,而不是上载的文件的名称。无法隐式地将HttpPostedFileBase转换为HttpPostedFile这一个比答案更适合我,因为正如他们的HTML所指出的,它允许在同一个文件输入中输入多个文件。这是正确答案,因为您应该能够使用
file.filename
获取文件名。如果您使用
foreach
执行此操作,并且具有重复的名称,则第一个文件将被多次保存。这对我们在iOS上是一个问题,因为“拍照”功能将每个文件命名为“image.jpg”-但此更改解决了此问题。谢谢。超级:-):-)。工作正常