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?