Недопустимое исключение приведения в HttpFileCollection
-
19-09-2019 - |
Вопрос
У меня есть метод расширения ниже, но когда я запускаю это, 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 обеспечивают доступ к содержимому и свойствам каждого файла.
Решение
Если вы посмотрите на пример кода на этой странице, он показывает, как вы должны перечислять коллекцию, фактически вы получаете строку при попытке перечисления в том виде, в каком вы есть.
http://msdn.microsoft.com/en-us/library/system.web.httpfilecollection.aspx
Другие советы
Тот самый HttpFileCollection
перечислитель коллекции возвращает ключи.Вам нужно использовать ключ на каждой итерации цикла для поиска связанного HttpPostedFile
объект.Итак, ваш цикл должен выглядеть следующим образом:
foreach (string name in collection) {
HttpPostedFile _file = collection[name];
// ...rest of your loop code...
}
Ну, я нашел решение, но оно выглядит таким глупым, но оно работает.
Я просто изменил 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;
}
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;
}
}