1. ホーム
  2. python

[解決済み] データベースに保存された画像を返すFlask

2023-03-24 04:06:13

質問

MongoDBに画像を保存していて、それをクライアントに返したいのですが、以下のようなコードになっています。

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

しかし、Flaskではバイナリを直接返せないようです?今のところ私の考えです。

  1. を返す。 base64 の画像バイナリを返します。問題はIE<8が対応していないことです。
  2. 一時ファイルを作成し、それを send_file .

もっと良い解決策はないのでしょうか?

どのように解決するのですか?

データを含むレスポンスオブジェクトを作成し、content typeヘッダを設定します。コンテントタイプヘッダーを 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.レスポンス

にファイルのようなオブジェクトを渡して、ヘッダ引数を send_file に渡して、完全な応答をセットアップさせることができます。使用方法 io.BytesIO を使ってください。

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