我有一个烧瓶应用程序,我正在尝试在flask-wtf-> flask-uploads接收到的文件上执行一些PIL/枕头操作,但是当我保存文件时我缺少字节,图像无效。
似乎甚至没有其他PIL操作的图像副本会损坏原始上传:
@sights_blueprint.route('/add', methods=['GET', 'POST'])
def add_image():
form = AddImageForm()
if request.method == 'POST':
if form.validate_on_submit():
# uploaded file
f = form.sights_image.data
filename = secure_filename(f.filename)
# PIL open + copy
img = Image.open(f).copy()
# save original file
f.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
导致:
original_file: 4622336 bytes
saved_file: 886784 bytes
如果我删除了img = Image.open(f).copy()
,则上传的文件正确保存。
如果i 仅使用pil打开图像:
# PIL open (no copy)
img = Image.open(f)
该文件也将正确保存。
但是,如果我执行任何操作,复制或其他操作,则结果保存的文件缺少字节和无效的图像。
如何实现此期望的工作流?
使用使用PIL Image.open(f)
打开的文件时,文件指针是先进的,但在编写文件之前不重置。我认为,在copy()
的情况下,文件指针将到达文件的末尾,并且不会写入字节,但似乎并不是基于我以前的部分写入。无论如何,解决方案是在保存之前将文件指针倒入文件启动。在我的用例中,也不需要打开副本。
img = Image.open(f)
# do some stuff to img
f.seek(0)
f.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))