2013-02-08 67 views
6

इस कोड को जब यह गैर रिक्त फ़ाइल फेंकनेforeach पाश कास्ट करने के लिए, लेकिन मैनुअल कास्टिंग और पाश काम के लिए

प्रकार के '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 सरणी एक मैन्युअल रूप से (प्रत्येक सूचकांक के साथ) के रूप में नीचे डिबग मोड में casted जा सकती है

?(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 
    } 
} 
में प्रत्येक आइटम का परीक्षण किया

कोई विचार क्या गलत हो रहा है? धन्यवाद

उत्तर

7

Request.Files एक है HttpFileCollection, जो बदले में NameObjectCollectionBase है। यह स्पष्ट नहीं है, लेकिन GetEnumerator() उस संग्रह के लिए कुंजी उत्पन्न करता है - आइटम स्वयं नहीं। तो:

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

    // .... 
} 

स्पष्ट नहीं है, खासकर जब से संग्रह गैर सामान्य IEnumerable बजाय IEnumerable<string> है।

यह at least documented है:

यह प्रगणक तारों के रूप में संग्रह की कुंजी देता है।

लेकिन: यह मान लेना फ़ाइल वस्तुओं कि Files से अधिक पुनरावृत्ति आप देना होगा आप में से अनुचित नहीं था।

+1

नोट: यदि यह * जेनेरिक संस्करण ('IEnumerable ') था, तो एक अच्छा मौका है कि संकलक ने आपको यह त्रुटि करने से रोका होगा; हालांकि, मुझे लगता है कि 'HttpFileCollection' प्री-डेट जेनेरिक। –

+0

फिर यह क्यों विफल रहता है जब फ़ाइल खाली नहीं होती है? पूर्व; अगर Request.Files [0] खाली है तो यह असफल नहीं होता है और अगले के माध्यम से जाता है और यदि अनुरोध। फ़ाइल [1] खाली नहीं है तो यह विफल हो जाता है।(या जब तक यह एक खाली आइटम नहीं मिलता है तब तक यह ठीक हो जाता है) – Kaf

+0

@ कैफ अगर कोई फाइल नहीं है, तो लूप करने के लिए कुछ भी नहीं है, इसलिए कोई असफल रूपांतरण नहीं है। अन्य समाचारों में, आप एक खाली 'int [] 'पर फिर से सक्रिय कर सकते हैं और प्रत्येक' int '(उनमें से कोई भी नहीं) को' SqlConnection' में परिवर्तित कर सकते हैं और इसकी परवाह नहीं होगी: क्योंकि * लूप पर कुछ भी नहीं है * । –

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 वस्तुओं की कुंजी देता है .. इसलिए केवल यह त्रुटि फेंकता है ..

+0

मैंने इस मुद्दे को लूप के साथ तय कर दिया है, मैं पूछ रहा हूं कि फ़ोरैच लूप विफल क्यों होता है। – Kaf

+0

@Kaf: 'System.Web.HttpPostedFile' टाइप करने के लिए 'System.String' प्रकार की ऑब्जेक्ट डालने में असमर्थ। क्या यह तुम्हारी त्रुटि है ...? – Pandian

+0

हां। यह भी क्यों विफल होता है जब फ़ाइल खाली नहीं होती है? – Kaf

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^