我正在尝试在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,同样的错误。
答案 0 :(得分:99)
HttpFileCollection
上的枚举器返回文件的键(名称),而不是HttpPostedFileBase
个对象。获得密钥后,使用带有密钥(文件名)的Item
([]
)属性来获取HttpPostedFileBase
对象。
foreach (string fileName in Request.Files)
{
HttpPostedFileBase file = Request.Files[fileName];
...
}
答案 1 :(得分:28)
使用我的标签HTML:
<input class="valid" id="file" name="file" multiple="" type="file">
Request.Files将在数组中具有重复的名称。所以你应该这样解决:
for (int i = 0; i < Request.Files.Count; i++ ){
HttpPostedFileBase fileUpload = Request.Files[i];
答案 2 :(得分:10)
我们可以使用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 this[string name]
返回我们想要的对象。如果HttpFileCollectionBase
已实施IEnumerable<HttpPostedFileBase>
,那么我们可以正常地执行此操作。但是,它实现了非泛型IEnumerable
。
答案 3 :(得分:6)
您可以尝试迭代字符串并将其转换为HttpPostedFile,如下所示:
foreach (string file in Request.Files)
{
HttpPostedFile hFile = Request.Files[file] as HttpPostedFile;
if (hFile.ContentLength > 0)
FileUpload(hFile);
}
答案 4 :(得分:4)
不幸的是,tvanfosson的回答对我不起作用。虽然文件上传得很好,并且不会抛出任何错误,但只会使用其中一个文件会出现问题,因此同一文件将被保存两次而不是同时使用它们。
foreach语句循环遍历Request.Files中每个文件的名称似乎是一个问题,由于某种原因它不能作为我的密钥工作,只有第一个文件会被选中每一次。
HttpFileCollectionBase files = Request.Files;
for(var i = 0; i < files.Count; i++)
{
HttpPostedFileBase file = files[i];
...
}
答案 5 :(得分:4)
以下代码对我有用。
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;
}
答案 6 :(得分:0)
您可以像这样使用HttpPostedFile
从HttpFileCollection
中提取foreach
:
foreach (var obj in fileCollection)
{
HttpPostedFile file = fileCollection.Get(obj.ToString());
}