Meine Bilder werden in einer MongoDB gespeichert und ich möchte sie an den Client zurückgeben. Der Code sieht folgendermaßen aus:
@app.route("/images/<int:pid>.jpg")
def getImage(pid):
# get image binary from MongoDB, which is bson.Binary type
return image_binary
Es scheint jedoch, dass ich keine Binärdatei direkt in Flask zurückgeben kann. Meine bisherige Idee:
- Geben Sie die
base64
Bildbinärdatei zurück. Das Problem ist, dass IE <8 dies nicht unterstützt. - Erstellen Sie eine temporäre Datei und geben Sie sie mit zurück
send_file
.
Gibt es bessere Lösungen?
Antworten:
Erstellen Sie ein Antwortobjekt mit den Daten und legen Sie dann den Inhaltstyp-Header fest. Setzen Sie den Header für die Inhaltsdisposition auf,
attachment
wenn der Browser die Datei speichern soll, anstatt sie anzuzeigen.@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
Relevant: werkzeug.Headers und flask.Response
Sie können ein dateiähnliches Objekt an und die Header-Argumente übergeben,
send_file
damit die vollständige Antwort eingerichtet wird. Verwendungio.BytesIO
für Binärdaten:return send_file( io.BytesIO(image_binary), mimetype='image/jpeg', as_attachment=True, attachment_filename='%s.jpg' % pid)
quelle
b'<binary image data>'
) zu a führenUnicodeError
.send_file()
kann einfach besser sein.with
Klausel?Ich wollte nur bestätigen, dass der zweite Vorschlag von dav1d richtig ist - ich habe dies getestet (wobei obj.logo ein mongoengine ImageField ist), funktioniert gut für mich:
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')
Einfacher als das manuelle Erstellen eines Antwortobjekts und das Einstellen seiner Header.
quelle
Angenommen, ich habe den gespeicherten Bildpfad bei mir. Der folgende Code hilft beim Senden des Bildes.
from flask import send_file @app.route('/get_image') def get_image(): filename = 'uploads\\123.jpg' return send_file(filename, mimetype='image/jpg')
Uploads ist mein Ordnername, in dem mein Bild mit 123.jpg vorhanden ist.
[PS: Der Upload-Ordner sollte sich ab Ihrer Skriptdatei im aktuellen Verzeichnis befinden.]
Ich hoffe es hilft.
quelle
Folgendes hat für mich (für
Python 3.7.3
) funktioniert :import io import base64 import flask def get_encoded_img(image_path): img = Image.open(image_path, mode='r') img_byte_arr = io.BytesIO() img.save(img_byte_arr, format='PNG') my_encoded_img = base64.encodebytes(img_byte_arr.getvalue()).decode('ascii') return my_encoded_img ... # your api code ... img_path = 'assets/test.png' img = get_encoded_img(img_path) # prepare the response: data response_data = {"key1": value1, "key2": value2, "image": img} return flask.jsonify(response_data )
quelle