我正在尝试读取用户上传的图像,然后将图像显示回给他们。我想要执行此操作而不保存上载的图像文件。
我有这样的代码:
from flask import Flask, redirect, render_template, request, url_for, send_file
from PIL import Image, ImageDraw
from io import BytesIO
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
img = Image.open(request.files['file'].stream)
byte_io = BytesIO()
img.save(byte_io, 'PNG')
byte_io.seek(0)
return send_file(byte_io, mimetype='image/png')
Run Code Online (Sandbox Code Playgroud)
它产生此错误:
TypeError: send_file() got an unexpected keyword argument 'mimetype'
我尝试用mimetype其他有效参数替换,它只会给出相同的错误,但带有新参数的名称。所以我认为问题出在我的bytes_io。
更新:
为了澄清,send_file()我指的是内置flask.send_file()方法:
来自烧瓶文件
mimetype 猜测需要提供文件名或附件文件名。
...
- mimetype – 文件的 mimetype(如果提供)。如果给出了文件路径,则自动检测作为回退发生,否则将引发错误。
所以,你应该像这样提供
return send_file(io.BytesIO(obj.logo.read()),
attachment_filename='logo.png',
mimetype='image/png')
Run Code Online (Sandbox Code Playgroud)
我已经更新了我的答案,
首先,下面的示例代码应该可以正常运行,
from flask import Flask, request, send_file
app = Flask(__name__)
@app.route('/get_image')
def get_image():
if request.args.get('type') == '1':
filename = 'ok.gif'
else:
filename = 'error.gif'
return send_file(filename)
if __name__ == '__main__':
app.run()
Run Code Online (Sandbox Code Playgroud)
其次,如果您仍然遇到相同的错误,我认为您的环境有问题。您可以使用pip freeze.