0

Flask-WTF -> Flask-Uploads에서받은 파일에서 일부 PIL/베개 작업을 수행하려고하는 Flask 응용 프로그램이 있지만 파일을 저장할 때 바이트가 누락되어 이미지가 유효하지 않습니다.Flask-Uploads 데이터에서 PIL 이미지의 복사본을 만든 후 누락 된 바이트

그것도 원래의 업로드를 손상에 추가 PIL 운영 결과와 이미지의 복사본을 만드는 것 같다

: 나는 img = Image.open(f).copy()을 제거하면

original_file: 4622336 bytes 
saved_file:  886784 bytes 

는 업로드 된 파일은 다음과 같습니다에

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

결과 올바르게 저장되었습니다. 난 단지 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))