2016-08-24 5 views
8

में बोतल की तरह क्लेन के साथ अपलोड की गई फ़ाइल प्राप्त करने के लिए कैसे जब एक बोतल सर्वर की स्थापना, हम मैं Klein प्रलेखन से देख रहा हूँ जबअजगर

imagefile = flask.request.files['imagefile'] 
filename_ = str(datetime.datetime.now()).replace(' ', '_') + \ 
    werkzeug.secure_filename(imagefile.filename) 
filename = os.path.join(UPLOAD_FOLDER, filename_) 
imagefile.save(filename) 
logging.info('Saving to %s.', filename) 
image = exifutil.open_oriented_im(filename) 

द्वारा फ़ाइल उपयोगकर्ताओं द्वारा अपलोड किए प्राप्त करने के लिए, मैंने कोशिश कर सकते हैं http://klein.readthedocs.io/en/latest/examples/staticfiles.html देखा, हालांकि यह वेब सेवा पर अपलोड की गई फ़ाइल प्राप्त करने के बजाय webservice से फ़ाइल प्रदान करने जैसा लगता है। अगर मैं Klein सर्वर को abc.jpg प्राप्त करने और फ़ाइल सिस्टम में सहेजने में सक्षम होना चाहता हूं, तो क्या कोई दस्तावेज है जो मुझे उस उद्देश्य के लिए मार्गदर्शन कर सकता है?

+1

आप किसी भी अन्य चर की तरह एक HTTP अनुरोध (आमतौर पर एक पोस्ट) में एक फ़ाइल निकालने में सक्षम होना चाहिए। ऐसा लगता है कि क्लेन मोड़ पर आधारित है, इसलिए शायद [यह व्यक्ति समाधान] (http://www.cristinagreen.com/uploading-files-using-twisted-web.html) आपके लिए काम करेगा। –

+0

धन्यवाद, मैं एक नज़र डालेगा। – JLTChiu

उत्तर

2

Liam Kelly टिप्पणी के अनुसार, this post से स्निपेट काम करना चाहिए। cgi.FieldStorage का उपयोग करके इसे स्पष्ट रूप से भेजने के बिना फ़ाइल मेटाडेटा आसानी से भेजना संभव हो जाता है। एक क्लेन/मुड़ दृष्टिकोण कुछ इस तरह दिखेगा:

from cgi import FieldStorage 
from klein import Klein 
from werkzeug import secure_filename 

app = Klein() 

@app.route('/') 
def formpage(request): 
    return ''' 
    <form action="/images" enctype="multipart/form-data" method="post"> 
    <p> 
     Please specify a file, or a set of files:<br> 
     <input type="file" name="datafile" size="40"> 
    </p> 
    <div> 
     <input type="submit" value="Send"> 
    </div> 
    </form> 
    ''' 

@app.route('/images', methods=['POST']) 
def processImages(request): 
    method = request.method.decode('utf-8').upper() 
    content_type = request.getHeader('content-type') 

    img = FieldStorage(
     fp = request.content, 
     headers = request.getAllHeaders(), 
     environ = {'REQUEST_METHOD': method, 'CONTENT_TYPE': content_type}) 
    name = secure_filename(img[b'datafile'].filename) 

    with open(name, 'wb') as fileOutput: 
     # fileOutput.write(img['datafile'].value) 
     fileOutput.write(request.args[b'datafile'][0]) 

app.run('localhost', 8000) 

जो भी कारण के लिए, मेरे अजगर 3.4 (Ubuntu 14.04) cgi.FieldStorage के संस्करण सही परिणाम वापस नहीं करता है। मैंने इसे पायथन 2.7.11 पर परीक्षण किया और यह ठीक काम करता है। कहा जा रहा है कि, आप फ़ाइल नाम और अन्य मेटाडेटा को फ्रंटेंड पर भी एकत्र कर सकते हैं और उन्हें क्लेन के लिए अजाक्स कॉल में भेज सकते हैं। इस तरह आपको बैकएंड पर बहुत अधिक प्रसंस्करण नहीं करना पड़ेगा (जो आम तौर पर एक अच्छी बात है)। वैकल्पिक रूप से, आप यह समझ सकते हैं कि werkzeug द्वारा प्रदान की गई उपयोगिताओं का उपयोग कैसे करें। फ़ंक्शन werkzeug.secure_filename और request.files (यानी FileStorage) लागू करने या पुन: बनाने के लिए विशेष रूप से कठिन नहीं हैं।