2013-02-04 27 views
5

Để thay đổi kích thước hình ảnh khi upload (sử dụng PIL), tôi trọng các phương pháp tiết kiệm cho mô hình Điều tôi như vậy:Django - Bắt hình ảnh PIL tiết kiệm phương pháp để làm việc với lưu trữ Amazon s3boto

def save(self): 
    super(Article, self).save() 
    if self.image: 
     size = (160, 160) 
     image = Image.open(self.image) 
     image.thumbnail(size, Image.ANTIALIAS) 
     image.save(self.image.path) 

này hoạt động cục bộ nhưng trong quá trình sản xuất tôi gặp lỗi: NotImplementedError: Phần phụ trợ này không hỗ trợ đường dẫn tuyệt đối.

tôi đã cố gắng thay thế các dòng image.save với

image.save(self.image.url) 

nhưng sau đó tôi nhận được một IOError: [Errno 2] Không có tập tin hoặc thư mục: 'https://my_bucket_name.s3.amazonaws.com/article/article_images/2.jpg'

Đó là vị trí đúng của hình ảnh mặc dù. Nếu tôi đặt địa chỉ đó trong trình duyệt, hình ảnh sẽ xuất hiện ở đó. Tôi đã thử một số thứ khác nhưng cho đến nay, không có may mắn.

+0

Đây có phải là lần đầu tiên bạn chạy trang web của bạn ở đâu đó ngoài máy địa phương của bạn? – Dave

+0

Có. Nó là. Tại sao? – KrisF

Trả lời

7

Bạn nên thử và tránh lưu vào đường dẫn tuyệt đối; có File Storage API tóm tắt các loại hoạt động này cho bạn.

Nhìn vào PIL Documentation, có vẻ như chức năng save() hỗ trợ truyền đối tượng giống như tệp thay vì đường dẫn.

Tôi không trong một môi trường nơi tôi có thể kiểm tra mã này, nhưng tôi tin rằng bạn sẽ cần phải làm một cái gì đó như thế này thay vì dòng cuối cùng của bạn:

from django.core.files.storage import default_storage as storage 

fh = storage.open(self.image.name, "w") 
format = 'png' # You need to set the correct image format here 
image.save(fh, format) 
fh.close() 
+0

Đã thử. Có một AttributeError: đối tượng 'NoneType' không có thuộc tính 'write'. Có vẻ như fh = None – KrisF

+1

Tôi đã làm cho nó hoạt động bằng cách thay đổi dòng đầu tiên. Tôi đã cố gắng chỉnh sửa câu trả lời của bạn với ý định chấp nhận nó sau khi chỉnh sửa được phê duyệt nhưng bản chỉnh sửa đã bị từ chối. Không chắc chắn lý do tại sao. Dưới đây là những gì tôi đã thêm/thay đổi để làm cho nó hoạt động: từ django.core.files.storage nhập default_storage làm bộ nhớ fh = storage.open (self.image.name, "w") – KrisF

+0

@krisF thanks đã cập nhật câu trả lời của tôi :) – minism

Các vấn đề liên quan