Неверное исключение приведения в HttpFileCollection - PullRequest
3 голосов
/ 15 декабря 2009

У меня есть метод расширения ниже, но когда я запускаю его, foreach дает мне InvalidCastException и он говорит *

Невозможно привести объект типа 'System.String' для ввода 'System.Web.HttpPostedFile'.

Код:

public static List<Attachment> GetFiles(this HttpFileCollection collection) {
            if (collection.Count > 0) {
                List<Attachment> items = new List<Attachment>();
                foreach (HttpPostedFile _file in collection) {
                    if (_file.ContentLength > 0)
                        items.Add(new Attachment()
                        {
                            ContentType = _file.ContentType,
                            Name = _file.FileName.LastIndexOf('\\') > 0 ? _file.FileName.Substring(_file.FileName.LastIndexOf('\\') + 1) : _file.FileName,
                            Size = _file.ContentLength / 1024,
                            FileContent = new Binary(new BinaryReader(_file.InputStream).ReadBytes((int)_file.InputStream.Length))
                        });

                    else
                        continue;
                }
                return items;
            } else
                return null;
        }

Заранее спасибо.

MSDN говорит:

Клиенты кодируют файлы и передают их в теле контента с использованием multipart MIME-формат с HTTP-типом контента заголовок multipart / form-data. ASP.NET извлекает закодированные файлы из содержание тела на отдельных членов коллекции HttpFileCollection. Методы и свойства класса HttpPostedFile обеспечить доступ к содержимому и свойства каждого файла.

Ответы [ 4 ]

7 голосов
/ 15 декабря 2009

Если вы посмотрите на пример кода на этой странице, он показывает, как вы должны перечислять коллекцию, вы фактически получаете строку, когда пытаетесь перечислить как есть.

http://msdn.microsoft.com/en-us/library/system.web.httpfilecollection.aspx

3 голосов
/ 15 декабря 2009

Перечислитель коллекции HttpFileCollection возвращает ключи. Вам нужно использовать ключ в каждой итерации цикла, чтобы найти связанный объект HttpPostedFile. Итак, ваш цикл должен выглядеть так:

foreach (string name in collection) {
    HttpPostedFile _file = collection[name];
    // ...rest of your loop code...
}
1 голос
/ 15 декабря 2009

Ну, я нашел решение, но выглядит так глупо, но работает.

Я просто изменил foreach с этим:

foreach (string fileString in collection.AllKeys) {
                    HttpPostedFile _file = collection[fileString];
                    if (_file.ContentLength > 0)

                        items.Add(new Attachment()
                        {
                            ContentType = _file.ContentType,
                            Name = _file.FileName.LastIndexOf('\\') > 0 ? _file.FileName.Substring(_file.FileName.LastIndexOf('\\') + 1) : _file.FileName,
                            Size = _file.ContentLength / 1024,
                            FileContent = new Binary(new BinaryReader(_file.InputStream).ReadBytes((int)_file.InputStream.Length))
                        });

                    else
                        continue;
                }
0 голосов
/ 31 января 2013
HttpFileCollection hfc = Request.Files;
  for (int i = 0; i < hfc.Count; i++)
  {
     HttpPostedFile hpf = hfc[i];
     if (hpf.ContentLength > 0)
    {
     string _fileSavePath = _DocPhysicalPath  + "_" + hpf.FileName;
    }
  }
...