我在下面有一个扩展方法,但是当我运行此方法时,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的内容体中 带有HTTP Content-Type的MIME格式 multipart / form-data的标题。 ASP.NET 从中提取编码文件 内容正文成为个人成员 一个HttpFileCollection。方法和 HttpPostedFile类的属性 提供对内容的访问和 每个文件的属性。
答案 0 :(得分:7)
如果您查看此页面上的代码示例,它会显示您应该如何枚举该集合,当您尝试按原样枚举时,实际上是在获取字符串。
http://msdn.microsoft.com/en-us/library/system.web.httpfilecollection.aspx
答案 1 :(得分:3)
HttpFileCollection
集合枚举器返回键。您需要在循环的每次迭代中使用该键来查找关联的HttpPostedFile
对象。所以你的循环需要看起来像这样:
foreach (string name in collection) {
HttpPostedFile _file = collection[name];
// ...rest of your loop code...
}
答案 2 :(得分:1)
嗯,我找到了一个解决方案,但它看起来很愚蠢,但确实有效。
我只是用这一个改变了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;
}
答案 3 :(得分:0)
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;
}
}