请求搜查,档案

我试图在 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'.

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

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

87841 次浏览

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

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

HttpFileCollection上的枚举数返回文件的键(名称) ,而不返回 HttpPostedFileBase对象。获取密钥后,使用带有密钥(文件名)的 Item([])属性获取 HttpPostedFileBase对象。

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


...
}

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

通过遍历请求中每个文件的名称的 foreach 语句似乎是一个问题。文件,出于某种原因,它不能作为一个关键,我只有第一个文件将被选中每次。

HttpFileCollectionBase files = Request.Files;


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


...
}

在我的选项卡中,HTML 是:

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

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

for (int i = 0; i < Request.Files.Count; i++ ){
HttpPostedFileBase fileUpload = Request.Files[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;
}

我们可以使用 LINQ 来完成这项工作,但仍然可以按照要求使用 foreach:

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


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

正如@tvanfoson 所说,枚举器以字符串的形式返回文件名,而不是 HttpPostedFileBase。这个方法 HttpPostedFileBase this[string name]返回我们想要的对象。如果 HttpFileCollectionBase实现了 IEnumerable<HttpPostedFileBase>,那么我们就可以正常地进行预处理。但是,它实现了一个非泛型 IEnumerable

你可以像这样使用 foreachHttpFileCollection中得到 HttpPostedFile:

foreach (var obj in fileCollection)
{
HttpPostedFile file = fileCollection.Get(obj.ToString());
}