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

мои изображения хранятся в MongoDB, я хотел бы вернуть их клиенту, вот как выглядит код:

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

Однако кажется, что я не могу вернуть двоичный файл непосредственно в Flask?

  • Может ли bin () быть перегружен как oct () и hex () в Python 2.6?
  • Двоичный набор двоичных файлов в Python?
  • Упаковка 4 Целые числа как ONE BYTE?
  • Hadoop Streaming: Mapper 'wrapping' бинарный исполняемый файл
  • Поплавок в двоичный
  • Двоичное представление float в Python (бит не hex)
  • Вот что я сейчас придумал:

    1. верните base64 двоичного изображения. -> IE <8 не поддерживает это.
    2. создайте временный файл, затем верните его с помощью send_file .

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

  • sqlalchemy flask: AttributeError: объект «Session» не имеет атрибута «_model_changes» на session.commit ()
  • Фляжка 301 Ответ
  • Ошибка Python / Flask: «ImportError: невозможно импортировать имя _compare_digest»
  • Поддерживает ли флажок регулярные выражения в маршрутизации URL-адресов?
  • используя Flask и Tornado вместе?
  • Pythonic способ правильно отделить модель от приложения с помощью SQLAlchemy
  • 2 Solutions collect form web for “изображение возврата фляжки, созданное из базы данных”

    Установка правильных заголовков должна делать трюк:

     @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)) 

    это лучший способ (не проверял его).

    Просто хотел подтвердить, что второе предложение 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 и настроить его заголовки.

    Python - лучший язык программирования в мире.