【问题标题】:foreach loop fails to cast but manual casting and for loop workforeach 循环无法转换,但手动转换和 for 循环工作
【发布时间】:2013-01-24 07:26:04
【问题描述】:

此代码不起作用当它找到一个非空文件时抛出

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

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

【问题讨论】:

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


    【解决方案1】:

    尝试如下..它会工作

    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 对象。所以只有它会抛出错误。

    【讨论】:

    • 我已经用 for 循环解决了这个问题,我在问为什么 foreach 循环会失败。
    • @Kaf:无法将“System.String”类型的对象转换为“System.Web.HttpPostedFile”类型。这是你的错误吗...?
    • 是的。还有为什么只有当文件不为空时才会失败?
    • 它失败是因为 Request.Files 有键值并且它是字符串......(即)名称......如果它是空的,那么它不会尝试 For 循环条件......如果它有值然后它尝试 for 循环中的条件并尝试将该字符串分配给 HttpPostedFile 对象...所以只会发生错误...
    【解决方案2】:

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

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

    不明显,特别是因为集合是非泛型的IEnumerable 而不是IEnumerable&lt;string&gt;

    at least documented:

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

    但是:您并非认为遍历Files 会为您提供文件对象

    【讨论】:

    • 注意:如果它是通用版本 (IEnumerable&lt;string&gt;),那么编译器很有可能会阻止您犯此错误;但是,我想HttpFileCollection 早于泛型。
    • 那为什么只有当文件不为空时才会失败?前任;如果 Request.Files[0] 为空,则它不会失败并进入下一个,如果 Request.Files[1] 不为空,则它会失败。 (或者它可以迭代直到找到一个非空项目)
    • @Kaf 如果没有文件,则没有可循环的内容,因此没有失败的转换。在其他新闻中,您可以遍历一个空的 int[] 并将每个 ints(都不是)转换为 SqlConnection 并且它不会在意:因为 没有什么可以循环.
    • 非常适合我。当我尝试通过 c# 控制台应用程序中的本机 HttpClient 对象访问 Web api 时出现此错误游戏
    猜你喜欢
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 2014-12-11
    相关资源
    最近更新 更多