
शुभ संध्या, हबसर। मैं डाउनलोड किए गए फ़ाइल के आकार को सीमित करने के लिए थोड़ा अनुभव साझा करना चाहता हूं। सभी अनुभव अनुभव से प्राप्त किए गए थे।
टीके कैसा दिखता था:- टेम्पलेट में, फ़ाइलों के लिए फ़ील्ड के साथ एक फॉर्म बनाएँ
- सर्वर पर हम फ़ाइल एक्सटेंशन और उसके आकार की जांच करते हैं
- यदि सभी शर्तें पूरी हो जाती हैं, तो फ़ाइल डाउनलोड करें और डेटाबेस में लिंक को सहेजें
सब कुछ सरल लग रहा है, लेकिन फ़ाइल साइज़ की जाँच करते समय उदासी मुझ पर हावी हो गई। मैंने इस समस्या को कैसे हल किया? हैब्रकट में आपका स्वागत है।
शुरुआत
शुरुआत में, सबकुछ ठीक हो गया - और मैंने टेम्पलेट किया, और सर्वर साइड को भर दिया, और सब कुछ लोड हो गया - यह देखना अच्छा है। लेकिन यहाँ मैं समझता हूँ कि मुझे इस बात की कोई आवश्यकता नहीं है कि कोई भी व्यक्ति मुझे ४ जीबी की निकासी करना शुरू कर देगा। सर्वर के लिए यातायात। Google और
आधिकारिक गोदी खोजें जिसमें हम जादू की रेखाएँ देखते हैं:
डिफ़ॉल्ट रूप से फ्लास्क असीमित रूप से मेमोरी में फ़ाइल अपलोड को खुशी से स्वीकार करेगा, लेकिन आप MAX_CONTENT_LENGTH कॉन्फ़िगरेशन कुंजी सेट करके इसे सीमित कर सकते हैं:
from flask import Flask, Request app = Flask(__name__) app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
बहुत बढ़िया! कॉन्फ़िगर करने के लिए एक पंक्ति जोड़ें, भागो, और ... और हमें त्रुटि 413 मिलती है ... मुसीबत ... Google,
werkzeug.exception और
RequestEnityTooLarge खोजें । हम एक दृश्य डिजाइन प्राप्त करने की कोशिश कर रहे हैं
try: file = request.files["file"] except RequestEnityTooLarge as e: return "ERROR", 200
लेकिन परिणाम के बिना - ब्राउज़र एक त्रुटि के अलावा कुछ भी वापस नहीं करना चाहता है। यहां तक कि उल्टी भी हुई
@app.errorhandler(413)
कुछ भी मेरी मदद नहीं की, कंसोल को आउटपुट की गिनती नहीं है - क्लाइंट एक ड्रम में है।
विस्तार
मैंने अपने दिमाग को लगभग 5 दिनों तक तब तक रैक किया, जब तक कि मैं
फाइलस्टोरेज की फिलिंग में नहीं आ गया। यह वर्ग
ऑब्जेक्ट से विरासत में मिला
है और इसमें एक
रीड मेथड है जो रैम में सामग्री को पढ़ता है। और इस पद्धति का एक वैकल्पिक तर्क
आकार है , जो पढ़ने की जानकारी का अधिकतम आकार निर्धारित करता है। इसलिए और नृत्य।
ड्राफ्ट स्केच करें: from flask import Flask, render_template, request MAX_FILE_SIZE = 1024 * 1024 + 1 app = Flask(__name__) @app.route("/", methods=["POST", "GET"]) def index(): args = {"method": "GET"} if request.method == "POST": file = request.files["file"] if bool(file.filename): file_bytes = file.read(MAX_FILE_SIZE) args["file_size_error"] = len(file_bytes) == MAX_FILE_SIZE args["method"] = "POST" return render_template("index.html", args=args) if __name__ == "__main__": app.run(debug=True)
जहां चर
MAX_FILE_SIZE में हम अतिरिक्त को पकड़ने के लिए अधिकतम फ़ाइल आकार + 1 बाइट निर्दिष्ट करते हैं। बाकी, मुझे लगता है, अगर कुछ भी - तो कमेंट्री में सवाल करने की ज़रूरत नहीं है।
टेम्पलेट स्केच करें: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Uploads</title> </head> <body> {% if args["method"] == "POST" %} {% if args["file_size_error"] %} <h1> 1.!</h1> {% else %} <h1> .</h1> {% endif %} {% endif %} <form action="/" method="POST" enctype="multipart/form-data"> <input type="file" name="file"> <button type="submit"></button> </form> </body> </html>
भागो, जांच करो। 1mb से बड़ी फ़ाइल जारी करते समय। वे हम पर चिल्लाएंगे, चिल्लाएंगे, और हम अपने हाथों को रगड़ सकते हैं। सब कुछ काम करता है।
परिणाम
परिणामों के बारे में क्या कहा जा सकता है? शायद यह बैसाखी है। शायद मैं केतली, लंगड़ा और नीचे हूं। लेकिन maillist'e Developers में भी मुझे इस समस्या का सामान्य समाधान नहीं दिया गया।
हालांकि, इस समाधान में एक शून्य भी है, अर्थात् सीमा की भिन्नता और रैम की मात्रा।
इस नोट पर मैं अलविदा कहना चाहता हूं। पढ़ने के लिए धन्यवाद, टिप्पणियों में सभी आलोचनाओं को सुनकर मुझे खुशी होगी। सभी को शुभकामनाएँ!