Подтвердить что ты не робот

Изображение возврата фляжки, созданное из базы данных

мои изображения хранятся в 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.

Есть ли лучшие решения?

4b9b3361

Ответ 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 и настроить его заголовки.