по каждому по запросу.Файлы



Я пытаюсь загрузить несколько файлов в 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, с той же ошибкой.

574   6  

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

    Ничего не найдено.