2012-06-13 16 views
37

मेरी छवियाँ MongoDB में जमा हो जाती से बनाए गए छवि, मैं उन्हें ग्राहक को वापस किए जाने वाले यहाँ है कैसे कोड की तरह है:कुप्पी वापसी डेटाबेस

@app.route("/images/<int:pid>.jpg") 
def getImage(pid): 
    # get image binary from MongoDB, which is bson.Binary type 
    return image_binary 

हालांकि, ऐसा लगता है कि मैं यह कर सकते हैं ' फ्लास्क में सीधे बाइनरी वापस नहीं?

यहाँ क्या मैं अब के साथ आया है:

  1. वापसी छवि द्विआधारी का बेस 64। -> आईई < 8 इसका समर्थन नहीं करता है।
  2. एक temp फ़ाइल बनाएं और फिर send_file के साथ इसे वापस करें।

क्या बेहतर समाधान हैं?

+1

संभावित डुप्लिकेट [फ्लास्क प्रतिक्रिया में छवियों को कैसे वापस करें?] (Http://stackoverflow.com/questions/8637153/how-to-return-images-in-flask-response) – erickrf

उत्तर

70

डेटा के साथ प्रतिक्रिया ऑब्जेक्ट बनाएं और फिर सामग्री प्रकार शीर्षलेख सेट करें। यदि आप ब्राउज़र को फ़ाइल को प्रदर्शित करने के बजाय फ़ाइल को सहेजना चाहते हैं तो सामग्री स्वभाव शीर्षलेख को attachment पर सेट करें।

@app.route('/images/<int:pid>.jpg') 
def get_image(pid): 
    image_binary = read_image(pid) 
    response = make_response(image_binary) 
    response.headers.set('Content-Type', 'image/jpeg') 
    response.headers.set(
     'Content-Disposition', 'attachment', filename='%s.jpg' % pid) 
    return response 

प्रासंगिक: werkzeug.Headers और flask.Response

आप के लिए एक फ़ाइल की तरह oject और send_file को हैडर तर्क यह पूरा प्रतिक्रिया की स्थापना की जाने के लिए पारित कर सकते हैं। बाइनरी डेटा के लिए io.BytesIO का उपयोग करें:

return send_file(
    io.BytesIO(image_binary), 
    mimetype='image/jpeg', 
    as_attachment=True, 
    attachment_filename='%s.jpg' % pid) 
+0

क्या send_file फ़ाइल ऑब्जेक्ट को बंद करता है भेजने के बाद? यदि यह बाइट्सियो नहीं है, लेकिन कुछ अन्य फ़ाइल-ऑब्जेक्ट को बंद करने के लिए कॉल की आवश्यकता होती है(), इसे कौन कॉल करेगा? – baruch

+1

पाइथन 3 और फ्लास्क 0.12 का उपयोग करके, एक बाइनरी स्ट्रिंग ('बी '<बाइनरी छवि डेटा>'') प्रदान करने के परिणामस्वरूप 'यूनिकोड एरर' हो सकता है। 'send_file()' बस बेहतर हो सकता है। – GergelyPolonkai

32

बस पुष्टि करते हैं कि dav1d का दूसरा सुझाव सही है चाहता था - मैं इस परीक्षण किया (obj.logo एक mongoengine ImageField वह जगह है जहाँ), मेरे लिए ठीक काम करता है:

import io 

from flask import current_app as app 
from flask import send_file 

from myproject import Obj 

@app.route('/logo.png') 
def logo(): 
    """Serves the logo image.""" 

    obj = Obj.objects.get(title='Logo') 

    return send_file(io.BytesIO(obj.logo.read()), 
        attachment_filename='logo.png', 
        mimetype='image/png') 

एक प्रतिक्रिया ऑब्जेक्ट मैन्युअल रूप से बनाने और उसके शीर्षकों को सेटिंग्स बनाने से आसान है।

+0

यह वही था जो मैं ढूंढ रहा था। – pangeacake