Flask
फ़ाइल अपलोड
खोज…
वाक्य - विन्यास
- request.files ['नाम'] # एकल आवश्यक फ़ाइल
- request.files.get ('नाम') # कोई भी यदि पोस्ट नहीं किया गया है
- request.files.getlist ('नाम') # शून्य या अधिक फ़ाइलों की सूची पोस्ट की गई
- CombinedMultiDict ((request.files, request.form)) # संयोजन फ़ॉर्म और फ़ाइल डेटा
फ़ाइलें अपलोड कर रहा है
HTML फॉर्म
-
file
प्रकार इनपुट का उपयोग करें और ब्राउज़र एक फ़ील्ड प्रदान करेगा जो उपयोगकर्ता को अपलोड करने के लिए फ़ाइल का चयन करने की अनुमति देता है। - केवल
post
विधि वाले फॉर्म ही फाइल डेटा भेज सकते हैं। - प्रपत्र का
enctype=multipart/form-data
विशेषता सेट करना सुनिश्चित करें। अन्यथा फ़ाइल का नाम भेजा जाएगा, लेकिन फ़ाइल का डेटा नहीं। - एकल फ़ील्ड के लिए कई फ़ाइलों का चयन करने की अनुमति देने के लिए इनपुट पर
multiple
विशेषता का उपयोग करें।
<form method=post enctype=multipart/form-data>
<!-- single file for the "profile" field -->
<input type=file name=profile>
<!-- multiple files for the "charts" field -->
<input type=file multiple name=charts>
<input type=submit>
</form>
पायथन अनुरोध
HTTP अनुरोध करने के लिए अनुरोध एक शक्तिशाली पायथन लाइब्रेरी है। आप इसे (या अन्य टूल) बिना ब्राउजर के फाइल पोस्ट करने के लिए इस्तेमाल कर सकते हैं।
- बाइनरी मोड में पढ़ने के लिए फाइलें खोलें।
- कई डेटा संरचनाएं हैं जो
files
लेती हैं। यह(name, data)
ट्यूपल्स की एक सूची प्रदर्शित करता है, जो ऊपर की तरह कई फ़ाइलों की अनुमति देता है।
import requests
with open('profile.txt', 'rb') as f1, open('chart1.csv', 'rb') as f2, open('chart2.csv', 'rb') as f3:
files = [
('profile', f1),
('charts', f2),
('charts', f3)
]
requests.post('http://localhost:5000/upload', files=files)
यह एक संपूर्ण सूची नहीं है। अपने पसंदीदा टूल या अधिक जटिल परिदृश्यों का उपयोग करने वाले उदाहरणों के लिए, उस टूल के डॉक्स देखें।
अपलोड सर्वर पर सहेजें
अपलोड की गई फाइलें request.files
में उपलब्ध हैं, ऑब्जेक्ट्स फाइल करने के लिए एक MultiDict
मैपिंग फ़ील्ड नाम। []
या get
बजाय - getlist
उपयोग करें - अगर एक ही क्षेत्र के नाम के साथ कई फाइलें अपलोड की गई थीं।
request.files['profile'] # single file (even if multiple were sent)
request.files.getlist('charts') # list of files (even if one was sent)
request.files
ऑब्जेक्ट्स.फाइल्स में एक save
मेथड है जो फाइल को लोकल सेव करता है। फ़ाइलों को सहेजने के लिए एक सामान्य निर्देशिका बनाएं।
filename
का नाम फ़ाइल के साथ अपलोड किया गया नाम है। इसे ग्राहक द्वारा मनमाने ढंग से सेट किया जा सकता है, इसलिए इसे सुरक्षित और सुरक्षित नाम से जनरेट करने के लिए secure_filename
विधि से पास करें। यह सुनिश्चित नहीं करता है कि नाम अद्वितीय है , इसलिए मौजूदा फ़ाइलों को तब तक अधिलेखित कर दिया जाएगा जब तक कि आप उस का पता लगाने के लिए अतिरिक्त कार्य न करें।
import os
from flask import render_template, request, redirect, url_for
from werkzeug import secure_filename
# Create a directory in a known location to save files to.
uploads_dir = os.path.join(app.instance_path, 'uploads')
os.makedirs(uploads_dir, exists_ok=True)
@app.route('/upload', methods=['GET', 'POST'])
def upload():
if request.method == 'POST':
# save the single "profile" file
profile = request.files['profile']
profile.save(os.path.join(uploads_dir, secure_filename(profile.filename)))
# save each "charts" file
for file in request.files.getlist('charts'):
file.save(os.path.join(uploads_dir, secure_filename(file.name)))
return redirect(url_for('upload'))
return render_template('upload.html')
WTForms और फ्लास्क-WTF को डेटा पास करना
WTForms एक प्रदान करता है FileField
एक फ़ाइल प्रकार इनपुट रेंडर करने के लिए। यह अपलोड किए गए डेटा के साथ कुछ खास नहीं करता है। हालाँकि, चूंकि फ्लास्क फॉर्म डेटा ( request.form
) और फ़ाइल डेटा ( request.files
) को विभाजित करता है, आपको फॉर्म बनाते समय सही डेटा पास करना सुनिश्चित करना होगा। आप दो को एक ही संरचना में संयोजित करने के लिए एक CombinedMultiDict
का उपयोग कर सकते हैं जिसे WTForms समझता है।
form = ProfileForm(CombinedMultiDict((request.files, request.form)))
यदि आप फ्लास्क-डब्ल्यूटीएफ का उपयोग कर रहे हैं, तो फ्लास्क और डब्ल्यूटीफोर्म को एकीकृत करने के लिए एक विस्तार, सही डेटा पास करना आपके लिए स्वचालित रूप से नियंत्रित किया जाएगा।
WTForms में एक बग के कारण, प्रत्येक फ़ील्ड के लिए केवल एक फ़ाइल मौजूद होगी, भले ही कई अपलोड किए गए हों। अधिक विवरण के लिए इस समस्या को देखें। यह 3.0 में तय किया जाएगा।
PARSE CSV फाइलिंग के बिना FLASK में सूची के रूप में मौजूद है
डेवलपर्स को अक्सर उन वेब साइटों को डिज़ाइन करने की आवश्यकता होती है जो उपयोगकर्ताओं को CSV फ़ाइल अपलोड करने की अनुमति देती हैं। आमतौर पर वास्तविक CSV फ़ाइल को सहेजने का कोई कारण नहीं है क्योंकि अपलोड किए गए डेटाबेस में डेटा संसाधित और / या संग्रहीत किया जाएगा। हालाँकि, कई नहीं तो अधिकांश, CSV डेटा को पार्स करने के PYTHON तरीकों में डेटा को फ़ाइल के रूप में पढ़ने की आवश्यकता होती है। यदि आप वेब विकास के लिए FLASK का उपयोग कर रहे हैं तो यह थोड़ा सिरदर्द पेश कर सकता है।
मान लें कि हमारे CSV में एक हेडर पंक्ति है और यह निम्न की तरह दिखता है:
h1,h2,h3
'yellow','orange','blue'
'green','white','black'
'orange','pink','purple'
अब, मान लीजिए कि फ़ाइल अपलोड करने के लिए HTML फॉर्म निम्नानुसार है:
<form action="upload.html" method="post" enctype="multipart/form-data">
<input type="file" name="fileupload" id="fileToUpload">
<input type="submit" value="Upload File" name="submit">
</form>
चूँकि कोई भी आपके द्वारा अपने FLASK स्क्रिप्ट में csv का आयात करने के लिए तय किए गए पहिये को फिर से स्थापित नहीं करना चाहता है। इस बात की कोई गारंटी नहीं है कि लोग csv फ़ाइल को सही क्रम में कॉलम के साथ अपलोड करेंगे। यदि csv फ़ाइल में हेडर पंक्ति है, तो csv.DictReader विधि की सहायता से आप हेडर पंक्ति में प्रविष्टियों द्वारा दर्ज की गई CSV फ़ाइल को शब्दकोशों की सूची के रूप में पढ़ सकते हैं। हालाँकि, csv.DictReader को एक फ़ाइल की आवश्यकता है और सीधे स्ट्रिंग्स को स्वीकार नहीं करता है। आप सोच सकते हैं कि आपको पहले अपलोड की गई फ़ाइल को सहेजने के लिए FLASK विधियों का उपयोग करने की आवश्यकता है, नया फ़ाइल नाम और स्थान प्राप्त करें, इसे csv.DictReader का उपयोग करके खोलें , और फिर फ़ाइल को हटा दें। थोड़ा बेकार सा लगता है।
सौभाग्य से, हम फ़ाइल सामग्री को एक स्ट्रिंग के रूप में प्राप्त कर सकते हैं और फिर स्ट्रिंग को समाप्त लाइनों द्वारा विभाजित कर सकते हैं। सीएसवी विधि csv.DictReader इसे एक फ़ाइल के विकल्प के रूप में स्वीकार करेगा। निम्न कोड दर्शाता है कि फ़ाइल को अस्थायी रूप से सहेजे बिना इसे कैसे पूरा किया जा सकता है।
@application.route('upload.html',methods = ['POST'])
def upload_route_summary():
if request.method == 'POST':
# Create variable for uploaded file
f = request.files['fileupload']
#store the file contents as a string
fstring = f.read()
#create list of dictionaries keyed by header row
csv_dicts = [{k: v for k, v in row.items()} for row in csv.DictReader(fstring.splitlines(), skipinitialspace=True)]
#do something list of dictionaries
return "success"
चर csv_dicts अब शब्दकोशों की निम्नलिखित सूची है:
csv_dicts =
[
{'h1':'yellow','h2':'orange','h3':'blue'},
{'h1':'green','h2':'white','h3':'black'},
{'h1':'orange','h2':'pink','h3':'purple'}
]
यदि आप PYTHON में नए हैं, तो आप निम्न की तरह डेटा का उपयोग कर सकते हैं:
csv_dicts[1]['h2'] = 'white'
csv_dicts[0]['h3'] = 'blue'
अन्य समाधानों में io मॉड्यूल आयात करना और io.Stream विधि का उपयोग करना शामिल है। मुझे लगता है कि यह एक अधिक सरल दृष्टिकोण है। मेरा मानना है कि io पद्धति का उपयोग करने की तुलना में कोड का पालन करना थोड़ा आसान है। यह दृष्टिकोण एक अपलोड की गई CSV फ़ाइल को पार्स करने के उदाहरण के लिए विशिष्ट है।