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は でありHttpFileCollection、これは ですNameObjectCollectionBase。明らかではありませんが、 forはアイテム自体ではなく、コレクションのキーGetEnumerator()を生成します。そう:

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

    // ....
}

IEnumerable特にコレクションはではなく非ジェネリックであるため、明らかではありませんIEnumerable<string>

それ 少なくとも文書化されています:

この列挙子は、コレクションのキーを文字列として返します。

しかし、 を繰り返し処理するとfile objectsが得られると考えるのは不合理ではありませんでした。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 に答える