2008-11-11 15 views
11

क्या वेब ब्राउज़र सर्वर पर फ़ाइल अपलोड करते समय http शीर्षलेख में फ़ाइल आकार भेजते हैं? और यदि ऐसा है, तो क्या हैडर को पढ़कर फ़ाइल को अस्वीकार करना संभव है और पूरी अपलोड प्रक्रिया समाप्त होने की प्रतीक्षा न करें?अपलोड की गई फ़ाइल का आकार

उत्तर

11

http://www.faqs.org/rfcs/rfc1867.html

HTTP ग्राहकों कुल फ़ाइल इनपुट के लिए सामग्री-लंबाई की आपूर्ति करने, ताकि एक व्यस्त सर्वर यदि प्रस्तावित फ़ाइल डेटा यथोचित कार्रवाई की

होने के लिए बहुत बड़ी है पता लगा सकता है प्रोत्साहित किया जाता है

लेकिन सामग्री-लंबाई की आवश्यकता नहीं है, इसलिए आप इस पर भरोसा नहीं कर सकते हैं। इसके अलावा, एक हमलावर गलत सामग्री-लंबाई पैदा कर सकता है।

फ़ाइल सामग्री को पढ़ने के लिए एकमात्र विश्वसनीय तरीका है। ऐसा कहकर, यदि सामग्री-लंबाई मौजूद है और कनेक्शन बंद करने के लिए बहुत बड़ा है, तो करना उचित होगा।

इसके अलावा, सामग्री को मल्टीपार्ट के रूप में भेजा जाता है, इसलिए अधिकांश आधुनिक ढांचे पहले इसे डीकोड करते हैं। इसका मतलब है कि फ्रेमवर्क पूरा होने तक आपको फ़ाइल बाइट स्ट्रीम नहीं मिलेगी, जिसका अर्थ यह हो सकता है कि "पूरी फाइल अपलोड होने तक"।

1
  1. मुझे यकीन नहीं है, लेकिन आपको हेडर में भेजे गए किसी भी चीज़ पर भरोसा नहीं करना चाहिए, क्योंकि इसे उपयोगकर्ता द्वारा फिक्र किया जा सकता है।

  2. यह इस बात पर निर्भर करता है कि सर्वर कैसे काम करता है। उदाहरण के लिए PHP में आपकी स्क्रिप्ट तब तक नहीं चली जाएगी जब तक फ़ाइल अपलोड पूर्ण नहीं हो जाता है, इसलिए यह संभव नहीं होगा।

2

संपादित करें: बहुत दूर जाने से पहले, आप इस अन्य उत्तर को अपाचे कॉन्फ़िगरेशन पर भरोसा कर सकते हैं: Using jQuery, Restricting File Size Before Uploading। नीचे दिया गया विवरण केवल तभी उपयोगी है जब आपको वास्तव में और भी कस्टम प्रतिक्रिया की आवश्यकता हो।

हां, आप पूरी फ़ाइल के अपलोड की अनुमति देने से पहले कुछ जानकारी पहले से प्राप्त कर सकते हैं।

POST/HTTP/1.1 
Host: 127.0.0.1:8000 
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.7,fr-be;q=0.3 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Content-Type: multipart/form-data; boundary=---------------------------886261531333586100294758961 
Content-Length: 135361 

-----------------------------886261531333586100294758961 
Content-Disposition: form-data; name=""; filename="IMG_1132.jpg" 
Content-Type: image/jpeg 

(data starts here and ends with -----------------------------886261531333586100294758961) 

आप शीर्ष लेख में सामग्री-लंबाई है, और इसके अलावा वहाँ फ़ाइल भाग के शीर्षक में सामग्री प्रकार:

यहाँ enctype="multipart/form-data" विशेषता के साथ एक फार्म से आ रही हैडर का एक उदाहरण है (प्रत्येक फ़ाइल का अपना हेडर होता है, जो मल्टीपार्ट एन्कोडिंग का उद्देश्य है)। सावधान रहें कि फ़ाइल प्रकार अनुमान लगाकर प्रासंगिक सामग्री-प्रकार सेट करना ब्राउज़र की ज़िम्मेदारी है; आप इसकी गारंटी नहीं दे सकते हैं, लेकिन इसे जल्दी अस्वीकृति के लिए काफी विश्वसनीय होना चाहिए (फिर भी जब आप पूरी तरह से उपलब्ध हों तो आप पूरी फ़ाइल को बेहतर ढंग से जांच लेंगे)।

अब, एक गोचा है। मैं छवि फ़ाइलों को उस तरह फ़िल्टर नहीं करता था, आकार पर नहीं, बल्कि सामग्री-प्रकार पर; लेकिन जैसे ही आप जितनी जल्दी हो सके अनुरोध को रोकना चाहते हैं, वही समस्या उत्पन्न होती है: संपूर्ण अनुरोध भेजे जाने के बाद ब्राउज़र केवल आपकी प्रतिक्रिया प्राप्त करता है, जिसमें फॉर्म सामग्री शामिल है और इस प्रकार फाइलें अपलोड की गई हैं।

यदि आप प्रदान की गई सामग्री नहीं चाहते हैं और अपलोड को रोकना चाहते हैं, तो आपके पास सॉकेट को क्रूरता से बंद करने के अलावा कोई विकल्प नहीं है। उपयोगकर्ता केवल एक भ्रमित "सहकर्मी द्वारा कनेक्शन रीसेट" संदेश देखेंगे। और वह बेकार है, लेकिन यह डिजाइन द्वारा है।

तो आप केवल पृष्ठभूमि एसिंक्रोनस चेक के मामले में इस विधि का उपयोग करना चाहते हैं (फ़ाइल फ़ील्ड को जांचने वाले टाइमर का उपयोग करके)। इसलिए मैं था कि हैक:

  • मैं jQuery का उपयोग मुझे बताने की अगर फाइल क्षेत्र
  • जब एक नई फ़ाइल चुन लिया जाता है बदल गया है, अक्षम एक ही रूप पर अन्य सभी फ़ाइल क्षेत्रों केवल उसी एक पाने के लिए ।
  • फ़ाइल एसिंक्रोनस रूप से भेजें
  • सर्वर साइड, (, सामग्री लंबाई, सामग्री प्रकार ...) की जांच शीर्ष लेख, जैसे ही कनेक्शन को काट (jQuery यह तुम्हारे लिए क्या कर सकते हैं, यह एक छिपे हुए फ्रेम का उपयोग करता है) जैसा कि आपको चाहिए जो आपको चाहिए।
  • एक सत्र चर सेट करें कि क्या यह फ़ाइल ठीक है या नहीं।
  • क्लाइंट-साइड, फ़ाइल को फ्रेम पर अपलोड किया गया है, यदि कनेक्शन बंद होने पर आपको किसी प्रकार का फीडबैक भी नहीं मिलता है। आपका एकमात्र विकल्प टाइमर है।
  • ग्राहक-पक्ष, एक टाइमर सर्वर अपलोड की गई फ़ाइल के लिए स्थिति प्राप्त करने के लिए मतदान करता है। सर्वर पक्ष, आपके पास उस सत्र परिवर्तनीय सेट है, इसे वापस ब्रोवर को भेजें।
  • ग्राहक का स्टेटस कोड है; इसे अपने फॉर्म में प्रस्तुत करें: त्रुटि संदेश, हरा चेकमार्क/लाल एक्स, जो भी हो। फ़ाइल फ़ील्ड को रीसेट करें या फॉर्म को अक्षम करें, आप तय करते हैं। अन्य फ़ाइल फ़ील्ड को फिर से सक्षम करना न भूलें।

काफी गन्दा, आह? यदि आप में से कोई भी बेहतर विकल्प है, तो मैं सभी कान हूं।

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