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))