2013-02-08 36 views
6

Mã này không làm việc khi nó tìm thấy một none tập tin rỗng némforeach vòng lặp không đúc nhưng thủ công đúc và cho công việc lặp

Không thể cast đối tượng của loại 'System.String' để nhập 'System.Web.HttpPostedFile'.

foreach (System.Web.HttpPostedFile f in Request.Files) 
{ 
    if (f.ContentLength > 0 && f.FileName.EndsWith(".pdf")) 
    { 
     //work done here 
    } 
} 

Ngoài ra tôi kiểm tra từng hạng mục trong Request.Files mảng một có thể được đúc bằng tay trong chế độ gỡ lỗi như sau (với mỗi chỉ số)

?(System.Web.HttpPostedFile)Request.Files[index] 
{System.Web.HttpPostedFile} 
    ContentLength: 536073 
    ContentType: "application/pdf" 
    FileName: "E:\\2.pdf" 
    InputStream: {System.Web.HttpInputStream} 

Tuy nhiên, mã Sau việc

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 
    } 
} 

Bất kỳ ý tưởng gì đang xảy ra? Cảm ơn

Trả lời

7

Request.Files là một HttpFileCollection, lần lượt là NameObjectCollectionBase. Nó không phải là hiển nhiên, nhưng GetEnumerator() cho rằng sản lượng phím cho bộ sưu tập - không phải là các mục. Vì vậy:

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

    // .... 
} 

Không rõ ràng, đặc biệt là do bộ sưu tập không chung chung IEnumerable thay vì IEnumerable<string>.

at least documented:

Enumerator này trả về các phím của bộ sưu tập là chuỗi.

Nhưng: đó là không bất hợp lý của bạn để giả định rằng iterating trên Files sẽ cung cấp cho bạn tập tin đối tượng.

+1

lưu ý: nếu nó * có * là phiên bản chung ('IEnumerable '), thì có một cơ hội tốt trình biên dịch sẽ ngăn cản bạn thực hiện lỗi này; tuy nhiên, tôi giả sử Generics 'HttpFileCollection' trước ngày tháng. –

+0

Sau đó, tại sao nó không thành công khi tệp không rỗng? ví dụ; nếu Request.Files [0] rỗng thì nó không bị lỗi và chuyển sang phần tiếp theo và nếu Request.Files [1] không rỗng thì nó thất bại.(hoặc nó lặp lại cho đến khi nó tìm thấy một mục không trống) – Kaf

+0

@Kaf nếu không có tệp nào, không có gì để lặp lại, do đó không có chuyển đổi không thành công. Trong một tin khác, bạn có thể lặp qua một 'int [] rỗng và chuyển đổi từng' int '(tất cả không có trong số chúng) thành' SqlConnection' và nó sẽ không quan tâm: vì không có gì * lặp lại * . –

2

thử như dưới đây .. nó sẽ làm việc

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 trả chìa khóa của các tập tin, không phải là đối tượng HttpPostedFile .. vì vậy chỉ nó throws lỗi ..

+0

Tôi đã khắc phục sự cố với vòng lặp for, tôi hỏi tại sao vòng lặp foreach bị lỗi. – Kaf

+0

@Kaf: Không thể truyền đối tượng thuộc loại 'System.String' để nhập 'System.Web.HttpPostedFile'. đây có phải là lỗi của bạn không ...? – Pandian

+0

Có. Ngoài ra tại sao nó không chỉ khi tập tin không có sản phẩm nào? – Kaf

Các vấn đề liên quan