如何将PIL生成的图像发送给浏览器?
我正在使用烧瓶为我的应用程序。 我想发送一个图像(由PILdynamic生成)到客户端,而不保存在磁盘上。
任何想法如何做到这一点?
首先,您可以将图像保存到临时文件并删除本地文件(如果有的话):
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
这是一个没有任何临时文件等的版本(请看这里 ):
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)
我也在同样的情况下挣扎。 最后,我find了使用WSGI应用程序的解决scheme,它是“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)
请用适当的PIL操作replace“开放图像”操作。
事实certificate,烧瓶提供了一个解决scheme(rtm我自己!):
from flask import abort, send_file try: return send_file(image_file) except: abort(404)