foreach循环无法转换,但是手动转换和循环工作

时间:2013-02-08 13:54:28

标签: c# asp.net gridview file-upload .net-3.5

此代码在 找不到空文件 时抛出

  

无法将“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
   }
}

知道出了什么问题吗?感谢

2 个答案:

答案 0 :(得分:10)

Request.FilesHttpFileCollection,而后者是NameObjectCollectionBase。这并不明显,但是GetEnumerator()会产生集合的 - 而不是项目本身。所以:

foreach(string key in Request.Files) {
    // fetch by key:
    var file = Request.Files[key];

    // ....
}

不明显,特别是因为该集合是非通用的IEnumerable而不是IEnumerable<string>

at least documented

  

此枚举器以字符串形式返回集合的键。

但是:假设迭代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对象..所以只会抛出错误..