Изображение возврата фляжки, созданное из базы данных
мои изображения хранятся в MongoDB, я хотел бы вернуть их клиенту, вот как выглядит код:
@app.route("/images/<int:pid>.jpg")
def getImage(pid):
# get image binary from MongoDB, which is bson.Binary type
return image_binary
Однако, кажется, что я не могу вернуть двоичный файл непосредственно в Flask?
Вот что я сейчас придумал:
- возвращает base64 двоичного образа. → IE < 8 не поддерживает это.
- создайте временный файл, затем верните его с помощью
send_file
.
Есть ли лучшие решения?
Ответы
Ответ 1
Настройка правильных заголовков должна сделать трюк:
@app.route("/images/<int:pid>.jpg")
def getImage(pid):
response = make_response(image_binary)
response.headers['Content-Type'] = 'image/jpeg'
response.headers['Content-Disposition'] = 'attachment; filename=img.jpg'
return response
Релевантно: werkzeug.Headers и flask.Response
Изменить: Я только что видел, что вы можете передать дескриптор файла на flask.sendfile
, поэтому:
return send_file(io.BytesIO(image_binary))
- лучший способ.
Ответ 2
Просто хотел подтвердить, что второе предложение 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')
Легче, чем вручную создать объект Response и настроить его заголовки.