90

私の画像は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

より良い解決策はありますか?

4

4 に答える 4

156

データを使用して応答オブジェクトを作成してから、コンテンツタイプヘッダーを設定します。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.Headersflask.Response

ファイルのようなオブジェクトとヘッダー引数をに渡してsend_file、完全な応答を設定することができます。io.BytesIOバイナリデータの使用:

return send_file(
    io.BytesIO(image_binary),
    mimetype='image/jpeg',
    as_attachment=True,
    attachment_filename='%s.jpg' % pid)
于 2012-06-13T15:05:04.677 に答える
48

dav1dの2番目の提案が正しいことを確認したかっただけです-私はこれをテストしました(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オブジェクトを作成し、そのヘッダーを設定するよりも簡単です。

于 2014-08-06T01:10:09.360 に答える
13

保存された画像パスを持っているとします。以下のコードは、画像を送信するのに役立ちます。

from flask import send_file
@app.route('/get_image')
def get_image():
    filename = 'uploads\\123.jpg'
    return send_file(filename, mimetype='image/jpg')

uploadsは、123.jpgの画像が存在するフォルダ名です。

[追記:アップロードフォルダは、スクリプトファイルの時点で現在のディレクトリにある必要があります]

それが役に立てば幸い。

于 2018-10-27T21:49:20.790 に答える
6

以下は私のために働いた(のためにPython 3.7.3):

import io
import base64
# import flask
from PIL import Image

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 )
于 2020-01-13T04:52:45.317 に答える