此代码在 找不到空文件 时抛出
无法将“System.String”类型的对象强制转换为类型 'System.Web.HttpPostedFile'。
foreach (System.Web.HttpPostedFile f in Request.Files)
{
if (f.ContentLength > 0 && f.FileName.EndsWith(".pdf"))
{
//work done here
}
}
此外,我测试了Request.Files
数组中的每个项目,可以在调试模式下手动投放,如下所示(每个索引)
?(System.Web.HttpPostedFile)Request.Files[index]
{System.Web.HttpPostedFile}
ContentLength: 536073
ContentType: "application/pdf"
FileName: "E:\\2.pdf"
InputStream: {System.Web.HttpInputStream}
但是,以下代码可以
for (index = 0; index < Request.Files.Count; index++)
{
System.Web.HttpPostedFile f = Request.Files[index];
if (f.ContentLength > 0 && f.FileName.EndsWith(".pdf"))
{
//work done here
}
}
知道出了什么问题吗?感谢
答案 0 :(得分:10)
Request.Files
是HttpFileCollection
,而后者是NameObjectCollectionBase
。这并不明显,但是GetEnumerator()
会产生集合的键 - 而不是项目本身。所以:
foreach(string key in Request.Files) {
// fetch by key:
var file = Request.Files[key];
// ....
}
不明显,特别是因为该集合是非通用的IEnumerable
而不是IEnumerable<string>
。
此枚举器以字符串形式返回集合的键。
但是:假设迭代Files
会给你文件对象,不是不合理的。
答案 1 :(得分:2)
尝试如下..它会起作用
foreach (string fName in Request.Files)
{
System.Web.HttpPostedFile f = Request.Files[fName];
if (f.ContentLength > 0 && f.FileName.EndsWith(".pdf"))
{
//work done here
}
}
HttpFileCollection返回文件的键,而不是HttpPostedFile对象..所以只会抛出错误..