2008-09-16 15 views
34

मैं एएसपी.NET एप्लिकेशन में फ़ाइल अपलोड करने के लिए <input type="file" id="fileUpload" runat="server"> का उपयोग कर रहा हूं। मैं अपलोड के फ़ाइल प्रकार को सीमित करना चाहता हूं (उदाहरण: .xls या .xlsx फ़ाइल एक्सटेंशन तक सीमित)।मैं फ़ाइल अपलोड करने के फ़ाइल प्रकार को कैसे मान्य करूं?

जावास्क्रिप्ट या सर्वर-साइड सत्यापन दोनों ठीक हैं (जब तक कि फाइल साइड सत्यापन अपलोड होने से पहले सर्वर साइड सत्यापन हो जाएगा - वहां कुछ बहुत बड़ी फ़ाइलें अपलोड की जा सकती हैं, इसलिए वास्तविकता से पहले किसी भी सत्यापन की आवश्यकता होती है फाइलें अपलोड की गई हैं)।

उत्तर

29

लगता है जैसे आप सीमित विकल्प हैं करने के लिए जब से तुम से पहले होने की जांच चाहते हैं जा रहे हैं अपलोड मुझे लगता है कि फ़ाइल के विस्तार को सत्यापित करने के लिए आपको सबसे अच्छा जावास्क्रिप्ट का उपयोग करना है। आप वैध एक्सटेंशन का हैश बना सकते हैं और फिर यह देखने के लिए देख सकते हैं कि हैश में फ़ाइल अपलोड करने का विस्तार मौजूद है या नहीं।

HTML:

<input type="file" name="FILENAME" size="20" onchange="check_extension(this.value,"upload");"/> 
<input type="submit" id="upload" name="upload" value="Attach" disabled="disabled" /> 

जावास्क्रिप्ट: नहीं, कोई http://www.brettle.com/neatupload

अधिक तेज़ और सरल उपयोग करने के लिए:

var hash = { 
    'xls' : 1, 
    'xlsx' : 1, 
}; 

function check_extension(filename,submitId) { 
     var re = /\..+$/; 
     var ext = filename.match(re); 
     var submitEl = document.getElementById(submitId); 
     if (hash[ext]) { 
     submitEl.disabled = false; 
     return true; 
     } else { 
     alert("Invalid filename, please select another file"); 
     submitEl.disabled = true; 

     return false; 
     } 
} 
+11

मत भूलना, यह केवल क्लाइंट साइड सत्यापन है। मैं अभी भी इस चेक को बाईपास करने के लिए फॉर्म यूआरएल में 'मैन्युअल' HTTP-POST कर सकता हूं - आपको सर्वर साइड सत्यापन जांच भी करने की आवश्यकता होगी। –

+0

@jamie '.doc' और' .docx' शब्द दस्तावेज़ों की जांच कैसे करें ... –

+0

बस उन एक्सटेंशन को "हैश" चर में जोड़ें। var हैश = {'xls': 1, 'xlsx': 1, 'doc': 1, 'docx': 1}; – Jamie

1

ठीक है - आप पोस्ट-बैक पर सर्वर-साइड करने में सक्षम नहीं होंगे क्योंकि फ़ाइल पोस्ट-बैक के दौरान सबमिट (अपलोड) हो जाएगी।

मुझे लगता है कि आप जावास्क्रिप्ट का उपयोग कर क्लाइंट पर ऐसा करने में सक्षम हो सकते हैं। निजी तौर पर, मैं radUpload by Telerik नामक किसी तृतीय पक्ष घटक का उपयोग करता हूं। इसमें एक अच्छा क्लाइंट-साइड और सर्वर-साइड एपीआई है, और यह बड़ी फ़ाइल अपलोड के लिए प्रगति पट्टी प्रदान करता है।

मुझे यकीन है कि खुले स्रोत समाधान भी उपलब्ध हैं।

0

आपका एकमात्र विकल्प क्लाइंट-साइड सत्यापन मानता है, क्योंकि सर्वर पक्ष का अर्थ है कि फ़ाइल पहले ही अपलोड हो चुकी है। इसके अलावा एमआईएमई प्रकार आमतौर पर फ़ाइल एक्सटेंशन द्वारा निर्धारित किया जाता है।

फ़ॉर्म की ऑनसमिट घटना को अधिभारित करने के लिए jQuery जैसे जावास्क्रिप्ट फ्रेमवर्क का उपयोग करें। फिर एक्सटेंशन की जांच करें। यह ज्यादातर प्रयासों को सीमित करेगा। हालांकि यदि कोई व्यक्ति एक्सएलएस एक्सटेंशन में एक छवि बदलता है तो आपको एक समस्या होगी।

मुझे नहीं पता कि यह आपके लिए एक विकल्प है, लेकिन अपलोड करने के लिए सिल्वरलाइट या फ्लैश जैसे कुछ का उपयोग करते समय आपके पास अधिक क्लाइंट साइड कंट्रोल है। आप अपनी अपलोड प्रक्रिया के लिए इन तकनीकों में से किसी एक का उपयोग करने पर विचार कर सकते हैं।

6

जावास्क्रिप्ट से, आपको ऑनसममिट हैंडलर में फ़ाइल नाम प्राप्त करने में सक्षम होना चाहिए।

<form onsubmit="if (document.getElementById('fileUpload').value.match(/xls$/) || document.getElementById('fileUpload').value.match(/xlsx$/)) { alert ('Bad file type') ; return false; } else { return true; }">...</form> 
3

आप अपलोड नियंत्रण पर एक नियमित अभिव्यक्ति validator इस्तेमाल कर सकते हैं:

<asp:RegularExpressionValidator id="FileUpLoadValidator" runat="server" ErrorMessage="Upload Excel files only." ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.xls|.XLS|.xlsx|.XLSX)$" ControlToValidate="fileUpload"> </asp:RegularExpressionValidator> 

वहाँ भी इनपुट टैग की विशेषता को स्वीकार है:

अपने मामले में तो, आप की तरह कुछ करना चाहिए
<input type="file" accept="application/msexcel" id="fileUpload" runat="server"> 

लेकिन मैं ज्यादा सफलता नहीं था जब मैं इस (FF3 के साथ और IE7)

1

मैं वहाँ लगता है की कोशिश की ऐसा करने के विभिन्न तरीके हैं। चूंकि मैं एएसपी से परिचित नहीं हूं, इसलिए मैं आपको केवल एक विशिष्ट फ़ाइल प्रकार की जांच करने के लिए कुछ संकेत दे सकता हूं:

1) सुरक्षित तरीका: उस फ़ाइल प्रकार के शीर्षलेख के बारे में अधिक जानकारी प्राप्त करें, जिसे आप पास करना चाहते हैं। अपलोड की गई फ़ाइल को पार्स करें और हेडर की तुलना करें

2) त्वरित तरीका: फ़ाइल के नाम को दो टुकड़ों में विभाजित करें -> फ़ाइल का नाम और फ़ाइल का अंत। फ़ाइल के समाप्त होने की जाँच और फ़ाइलप्रकार आप

अपलोड करने की अनुमति देना चाहते हैं की तुलना आशा है कि यह मदद करता है :)

1

मानक Asp.Net नियंत्रण से बचें और Brettle विकास से NeadUpload घटक का उपयोग कॉन्फ़िगरेशन फ़ाइलों में maxRequestLength पैरामीटर के बारे में चिंता करना और एकीकृत करना बहुत आसान है।

3

जैसा कि कुछ लोगों ने उल्लेख किया है, जावास्क्रिप्ट जाने का रास्ता है। ध्यान रखें कि यहां "सत्यापन" केवल फ़ाइल एक्सटेंशन द्वारा है, यह मान्य नहीं होगा कि फ़ाइल एक असली एक्सेल स्प्रेडशीट है!

6

मैं क्रिस से सहमत हूं, विस्तार की जांच फ़ाइल के प्रकार की पुष्टि नहीं है जिस तरह से आप इसे देखते हैं। Telerik's radUpload शायद आपका सबसे अच्छा विकल्प है, यह अपलोड की जा रही फ़ाइल की एक सामग्री प्रकार प्रदान करता है, जिसे आप ज्ञात माइम प्रकारों से तुलना कर सकते हैं। आप की जाँच करनी चाहिए के लिए:

आवेदन/vnd.ms-एक्सेल,

आवेदन/एक्सेल,

आवेदन/x-Msexcel

और नए 2K7 प्रारूप के लिए:

आवेदन /vnd.openxmlformatsofficedocument.spreadsheetml.sheet

टेलीरिक एक व्यक्तिगत घटक के रूप में radUpload बेचने के लिए प्रयुक्त होता था, लेकिन अब यह वें में लपेटा जाता है ई कंट्रोल सूट, जो इसे थोड़ा अधिक महंगा बनाता है, लेकिन अब तक इसका सही तरीका

+0

, इस सेवा की लागत पैसे ... – Thundter

1

सुनिश्चित करें कि आप हमेशा सर्वर-साइड में फ़ाइल एक्सटेंशन की जांच करें ताकि यह सुनिश्चित किया जा सके कि कोई भी अपलोड नहीं कर सकता दुर्भावनापूर्ण फ़ाइल ऐसे .aspx, .asp आदि

1

एक विकल्प के विकल्प के रूप में के रूप में, आप "स्वीकार" HTML फ़ाइल इनपुट जो परिभाषित करता है जो MIME प्रकार स्वीकार्य हैं की विशेषता का उपयोग कर सकते हैं।

परिभाषा here

26

यह regulare अभिव्यक्ति सत्यापनकर्ता का उपयोग कर बहुत आसान है।

<asp:RegularExpressionValidator 
id="RegularExpressionValidator1" 
runat="server" 
ErrorMessage="Only zip file is allowed!" 
ValidationExpression ="^.+(.zip|.ZIP)$" 
ControlToValidate="FileUpload1" 
> </asp:RegularExpressionValidator> 

Client-Side Validation of File Types Permissible to Upload

+1

रेगेक्स डिफ़ॉल्ट रूप से केस-संवेदी है। आप समूह के लिए (? I) का उपयोग करके अक्षम कर सकते हैं (जैसा कि यहां बताया गया है -> http://www.exampledepot.com/egs/java.util.regex/Case.html)। यह जावास्क्रिप्ट के लिए काम नहीं करेगा, हालांकि (जैसा कि यहां बताया गया है http://stackoverflow.com/questions/2641236/make-regular-expression-case- संवेदनशील और मेरे द्वारा व्यक्तिगत रूप से परीक्षण किया गया)। – marquito

3

KD7 के आप फ़ाइलों सामग्री प्रकार के लिए जाँच का सुझाव दे उत्तर के आधार पर, यहाँ एक आवरण विधि है:

private bool FileIsValid(FileUpload fileUpload) 
{ 
    if (!fileUpload.HasFile) 
    { 
     return false; 
    } 
    if (fileUpload.PostedFile.ContentType == "application/vnd.ms-excel" || 
     fileUpload.PostedFile.ContentType == "application/excel" || 
     fileUpload.PostedFile.ContentType == "application/x-msexcel" || 
     fileUpload.PostedFile.ContentType == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" //this is xlsx format 
     ) 
     return true; 

    return false; 
} 

सच लौटने अगर अपलोड करने के लिए फ़ाइल .xls या .xlsx है

0

एक अन्य उत्तरदाता नोट के रूप में, फ़ाइल प्रकार को धोखा दिया जा सकता है (उदाहरण के लिए, .exe का नाम बदल दिया .pdf), जो एमआईएमई प्रकार की जांच नहीं करेगा, यानी .exe w बीपीएफ के रूप में नामित होने पर बीमार "एप्लिकेशन/पीडीएफ" का एक एमआईएम दिखाएं)। मेरा मानना ​​है कि सही फ़ाइल प्रकार की जांच केवल सर्वर की तरफ की जा सकती है; System.IO का उपयोग करके इसे जांचने का एक आसान तरीका।BinaryReader यहाँ वर्णित है:

http://forums.asp.net/post/2680667.aspx

और वीबी यहाँ संस्करण:

http://forums.asp.net/post/2681036.aspx

ध्यान दें कि आप फ़ाइल प्रकार (ओं) के लिए बाइनरी 'कोड' की जानकारी होनी चाहिए कि आप ' फिर से जांच कर रहे हैं, लेकिन आप इस समाधान को लागू करके और कोड डीबग करके उन्हें प्राप्त कर सकते हैं।

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