0

我有一个 Flask 应用程序,我试图对从 Flask-WTF -> Flask-Uploads 接收的文件执行一些 PIL/Pillow 操作,但是当我保存文件时,我缺少字节并且图像不是有效的。

似乎即使在没有额外 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)

该文件也将正确保存。

但是,如果我执行任何操作、复制或其他操作,生成的保存文件会丢失字节和无效图像。

我怎样才能实现这个理想的工作流程?

4

1 回答 1

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))
于 2017-09-05T23:33:16.893 回答