10

当发现抛出非空文件时,此代码不起作用

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

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

4

2 回答 2

15

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

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

    // ....
}

不明显,特别是因为该集合是非泛型的IEnumerable,而不是IEnumerable<string>.

至少记录在案

此枚举器将集合的键作为字符串返回。

但是:你认为迭代会给你文件对象并不是不合理的。Files

于 2013-02-08T14:03:38.287 回答
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 对象..所以只有它抛出错误..

于 2013-02-08T14:00:42.600 回答