foreach on Request.Files
The enumerator on the HttpFileCollection
returns the keys (names) of the files, not the HttpPostedFileBase
objects. Once you get the key, use the Item
([]
) property with the key (filename) to get the HttpPostedFileBase
object.
foreach (string fileName in Request.Files){ HttpPostedFileBase file = Request.Files[fileName]; ...}
With my tab HTML is:
<input class="valid" id="file" name="file" multiple="" type="file">
Request.Files will have duplicate name in array. So you should solve like this:
for (int i = 0; i < Request.Files.Count; i++ ){ HttpPostedFileBase fileUpload = Request.Files[i];
We can use LINQ to do this and still use foreach as asked:
var files = Enumerable.Range(0, Request.Files.Count) .Select(i => Request.Files[i]);foreach (var file in files){ // file.FileName}
As @tvanfosson said, the enumerator returns the file names as strings, not the HttpPostedFileBase
. This method HttpPostedFileBase this[string name]
returns the object we want. If HttpFileCollectionBase
implemented IEnumerable<HttpPostedFileBase>
then we could do the foreach normally. However, it implements a non-generic IEnumerable
.