Nice programing

데이터베이스에 저장된 이미지를 반환하는 Flask

nicepro 2020. 12. 10. 21:06
반응형

데이터베이스에 저장된 이미지를 반환하는 Flask


내 이미지는 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.

더 나은 솔루션이 있습니까?


데이터로 응답 개체를 만든 다음 콘텐츠 형식 헤더를 설정합니다. 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 . 헤더플라스크.

send_file완전한 응답을 설정하기 위해 파일과 같은 객체와 헤더 인수를 전달할 수 있습니다 . 사용 io.BytesIO바이너리 데이터에 대한 :

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

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

수동으로 응답 개체를 만들고 헤더를 설정하는 것보다 쉽습니다.


나와 함께 저장된 이미지 경로가 있다고 가정합니다. 아래 코드는 이미지를 보내는 데 도움이됩니다.

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가있는 내 이미지가있는 폴더 이름입니다.

[PS : 업로드 폴더는 스크립트 파일의 현재 디렉토리에 있어야합니다.]

도움이 되었기를 바랍니다.

참고 URL : https://stackoverflow.com/questions/11017466/flask-to-return-image-stored-in-database

반응형