Flask to return image stored in database

binary, flask, python

Solution

Create a response object with the data and then set the content type header. Set the content disposition header to `attachment` if you want the browser to save the file instead of displaying it.

@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

Relevant: werkzeug.Headers and flask.Response

You can pass a file-like object and the header arguments to `send_file` to let it set up the complete response. Use `io.BytesIO` for binary data:

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

Prior to Flask 2.0, `download_name` was called `attachment_filename`.

Problem

My images are stored in a MongoDB, and I'd like to return them to the client, here is how the code is like: ``` @app.route("/images/<int:pid>.jpg") def getImage(pid): # get image binary from MongoDB, which is bson.Binary type return image_binary ``` However, it seems that I can't return binary directly in Flask? My idea so far: - Return the `base64` of the image binary. The problem is that IE<8 doesn't support this. - Create a temporary file then return it with `send_file`. Are there better solutions?

Original source

Related problems