по каждому по запросу.Файлы
Я пытаюсь загрузить несколько файлов в 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, с той же ошибкой.
6 ответов:
перечислитель на
HttpFileCollectionвозвращает ключи (имена) файлов, а неHttpPostedFileBaseобъекты. Как только вы получите ключ, используйтеItem([]) свойство с ключом (имя файла), чтобы получить
С моей вкладкой 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];
мы можем использовать 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>тогда мы могли бы сделать foreach нормально. Однако он реализует не общийIEnumerable.
вы можете попробовать повторить строки и привести их к HttpPostedFile вместо этого, например:
foreach (string file in Request.Files) { HttpPostedFile hFile = Request.Files[file] as HttpPostedFile; if (hFile.ContentLength > 0) FileUpload(hFile); }
к сожалению, ответ tvanfosson не работает для меня. Хотя файлы будут загружаться просто отлично, и никакая ошибка не будет выброшена, возникнет проблема, когда будет использоваться только один из файлов, поэтому один и тот же файл будет сохранен дважды, а не использовать их оба.
казалось, что проблема заключается в том, что оператор foreach перебирает имена каждого файла в запросе.Файлы, по какой-то причине он не работал в качестве ключа для меня, и только первый файл будет выбран каждый раз.
HttpFileCollectionBase files = Request.Files; for(var i = 0; i < files.Count; i++) { HttpPostedFileBase file = 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; }
Comments