我正在使用Flask开发我的应用程序。我想发送一张由PIL动态生成的图像给客户端,而无需将其保存到磁盘上。
你有什么好的建议吗?
你有什么好的建议吗?
from io import StringIO
def serve_pil_image(pil_img):
img_io = StringIO()
pil_img.save(img_io, 'JPEG', quality=70)
img_io.seek(0)
return send_file(img_io, mimetype='image/jpeg')
在你的代码中使用,只需执行以下操作
@app.route('some/route/')
def serve_img():
img = Image.new('RGB', ...)
return serve_pil_image(img)
img
标签的src
属性中引用该文件? - Riley Fitzpatrickimg
标签的src
属性中引用文件的人,只需使用一个端点来提供图像@app.route('/docs/<filename>')
,然后在HTML中使用src="/docs/some_img.jpg"
即可。 - GreenMr. Mr. 实际上做得非常出色。我不得不使用 BytesIO() 而不是 StringIO()。
def serve_pil_image(pil_img):
img_io = BytesIO()
pil_img.save(img_io, 'JPEG', quality=70)
img_io.seek(0)
return send_file(img_io, mimetype='image/jpeg')
send_file
需要一个路径字符串。我该如何从BytesIO对象中获取路径? - Riley Fitzpatrickurl_for()
,它可以正常工作了。 - Riley Fitzpatrick首先,您可以将图像保存到临时文件中并删除本地文件(如果有):
from tempfile import NamedTemporaryFile
from shutil import copyfileobj
from os import remove
tempFileObj = NamedTemporaryFile(mode='w+b',suffix='jpg')
pilImage = open('/tmp/myfile.jpg','rb')
copyfileobj(pilImage,tempFileObj)
pilImage.close()
remove('/tmp/myfile.jpg')
tempFileObj.seek(0,0)
其次,按照这个stackoverflow问题的建议,将临时文件设置为响应:
from flask import send_file
@app.route('/path')
def view_method():
response = send_file(tempFileObj, as_attachment=True, attachment_filename='myfile.jpg')
return response
TypeError: 'file' object is not callable
- letmaikfrom flask import abort, send_file
try:
return send_file(image_file)
except:
abort(404)
我曾经也陷入了同样的困境。最终,我使用了一个WSGI应用程序来解决这个问题,它可以作为“make_response”的参数。
from Flask import make_response
@app.route('/some/url/to/photo')
def local_photo():
print('executing local_photo...')
with open('test.jpg', 'rb') as image_file:
def wsgi_app(environ, start_response):
start_response('200 OK', [('Content-type', 'image/jpeg')])
return image_file.read()
return make_response(wsgi_app)
return send_file(fileName, mimetype='image/png')