2014-04-28 3 views
3

내 장고 프로젝트에서 필자는 inmemoryuploadedfile을 가지고 있으며, 필로우로 이것을 열고 회전시킨 다음 다시 저장합니다. 그러나 마지막 단계는 실제로 작동하지 않습니다. 파일에 저장하면 올바른 (회전 된) 이미지가 저장됩니다. 어떻게하면 실제 파일 대신 파일 객체에 다시 저장할 수 있습니까?베개로 메모리 파일 객체 저장하기

image = request.FILES['file'] 
    img = Image.open(image) 
    img = img.rotate(90) 
    img.save("sample.jpeg", "jpeg") #this is correct 
    img.save(image, "jpeg") #this does not change the actual in memory image 

답변

4

업로드 된 파일을 보유하는 기본 StreamIO 개체의 스트림 위치를 다시 설정해야합니다. 그렇지 않으면 Image.save()는 스트림의 끝 부분에만 추가됩니다.

메모리에서 파일을 다시 읽으려면 스트림 위치를 재설정해야 할 수도 있습니다. UploadedFile (InMemoryUploadedFile의 기본 클래스) 파일 크기를 추적, 당신은 기본 파일 객체를 변경하는 경우, 코드 InMemoryUploadedFile.size에 따라하는 것은 혼동 수

image = request.FILES['file'] 
img = Image.open(image) 
img = img.rotate(90) 
image.seek(0) 
img.save(image, "jpeg") 
image.seek(0) 
image.read() 

참고.

+0

어쨌든 길이를 재설정 할 수 있습니까? 내가하고있는 일은 이미지를 회전시키는 것이지만 베개는 exif 데이터를 없애 파일이 다소 작아 져야합니다. – Igglyboo

+0

image.size를 새로운 값으로 설정하여 파일 크기를 업데이트 할 수 있어야합니다. 여기에있는 _get_size_from_underlying_file() 메소드 (https://github.com/django/django/blob/master/django/core/files/base.py#L39)를 사용해 볼 수도 있습니다. image.size = image._get_size_from_underlying_file()과 비슷합니다. –