0

我有一个Flask应用程序,我试图对从Flask-WTF接收的文件执行一些PIL/Pillow操作 - > Flask-Uploads,但当我保存文件时,我缺少字节,图像无效。从Flask上传数据复制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()上传文件正确保存。

如果我只打开与PIL图像:

# PIL open (no copy) 
    img = Image.open(f) 

文件也正确保存。

但是,如果我执行任何操作,复制或以其他方式,结果保存的文件是缺少字节和无效的图像。

我该如何实现这个所需的工作流程?

+1

我想'f'是一个只能被读取一次的流。 'Image.open'实际上并不立即在图像中读取,而是'copy'强制它被使用。 –

回答

0

当针对使用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))