foreach在Request.Files
我试图上传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,但是当它被迭代时,它返回string(大概是文件名)。
注意:我知道这可以用for循环来解决。 另外,我尝试使用HttpPostedFile,具有相同的错误。
HttpFileCollection
上的枚举HttpFileCollection
返回文件的键(名称),而不是HttpPostedFileBase
对象。 一旦获得密钥,使用键(文件名)的Item
( []
)属性来获取HttpPostedFileBase
对象。
foreach (string fileName in Request.Files) { HttpPostedFileBase file = Request.Files[fileName]; ... }
与我的标签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];
我们可以使用LINQ来做到这一点,仍然使用foreach作为问题:
var files = Enumerable.Range(0, Request.Files.Count) .Select(i => Request.Files[i]); foreach (var file in files) { // file.FileName }
正如@tvanfosson所说,枚举器将文件名称作为string返回,而不是HttpPostedFileBase
。 这个方法HttpPostedFileBase this[string name]
返回我们想要的对象。 如果HttpFileCollectionBase
实现了IEnumerable<HttpPostedFileBase>
那么我们可以正常的使用foreach。 但是,它实现了一个非genericsIEnumerable
。
您可以尝试迭代string并将其转换为HttpPostedFile,如下所示:
foreach (string file in Request.Files) { HttpPostedFile hFile = Request.Files[file] as HttpPostedFile; if (hFile.ContentLength > 0) FileUpload(hFile); }
下面的代码为我工作。
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; }
不幸的是,Tvanfosson的回答对我来说并不合适。 虽然这些file upload得很好,并且不会出现错误,但只会使用其中一个文件,因此同一文件将被保存两次,而不是同时使用这两个文件。
这似乎是foreach语句循环通过Request.Files中的每个文件的名称的一个问题,出于某种原因,它不作为我的关键,每次只有第一个文件将被选中。
HttpFileCollectionBase files = Request.Files; for(var i = 0; i < files.Count; i++) { HttpPostedFileBase file = files[i]; ... }
- 哪个事件首先被调用? 主页面Page_Load或内容页面Page_Load
- Windows进程激活服务(WAS)在启动工作进程为应用程序池提供服务时遇到了故障
- 我们可以在网页中使用多种forms吗?
- logging最佳实践
- 错误Microsoft.Web.Infrastructure,版本= 1.0.0.0,文化=中立,PublicKeyToken = 31bf3856ad364e35
- 从HttpContext获取当前的System.Web.UI.Page?
- 内置的帮助器将User.Identity.Nameparsing为Domain \ Username
- 从C#中的DataTable中删除列
- asp.netvalidation,以确保文本框具有整数值