我正在使用烧瓶进行申请。我想将图像(由PIL动态生成)发送到客户端而不保存在磁盘上。
知道怎么做吗?
答案 0 :(得分:143)
这是一个没有任何临时文件等的版本(见here):
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)
答案 1 :(得分:19)
首先,您可以将图像保存到tempfile并删除本地文件(如果有的话):
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)
其次,将临时文件设置为响应(根据this stackoverflow question):
from flask import send_file
@app.route('/path')
def view_method():
response = send_file(tempFileObj, as_attachment=True, attachment_filename='myfile.jpg')
return response
答案 2 :(得分:7)
我也在同样的情况下挣扎。最后,我使用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)
请用适当的PIL操作替换“打开图像”操作。
答案 3 :(得分:7)
事实证明,烧瓶提供了一个解决方案(rtm给自己!):
from flask import abort, send_file
try:
return send_file(image_file)
except:
abort(404)
答案 4 :(得分:6)
先生。先生确实做得很好。我必须使用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')
答案 5 :(得分:0)
return send_file(fileName, mimetype='image/png')