从烧瓶 - uploads数据中副本副本副本后,丢失的字节



我有一个烧瓶应用程序,我正在尝试在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))

最新更新