2017-03-03 69 views
0

我已經(最終)從Django 1.8升級到Django 1.10,雖然存在一些明顯的挑戰,唯一的困難是我的圖像上傳到S3。在升級Django的同時,我也被迫升級Boto & PIL。Django將圖像上傳到AWS S3升級到Django後無法正常工作1.10

雖然原始圖像仍然會正確上傳到請求的存儲桶(原件),但是,創建拇指並將其保存到另一個存儲桶的保存功能不再有效。

這裏是我的代碼是否正確工作,直到Django的/博託/ PIL升級:

class Photo(models.Model): 
    ... 

def save(self, *args, **kwargs): 
    super(Photo, self).save(*args, **kwargs) 
    self.create_avatar_thumb() 

def create_avatar_thumb(self): 
    import os 
    from PIL import Image 
    from django.core.files.storage import default_storage as storage 

    if not self.filename: 
     return "" 
    file_path = self.filename.name 

    filename_base, filename_ext = os.path.splitext(file_path) 
    original_file_path = "%s%s" % (filename_base, filename_ext) 

    xm_file_path = original_file_path.replace('originals/', 'xm/') 

    if storage.exists(xm_file_path): 
     return "exists" 

    # resize the original image to xs 
    f = storage.open(file_path, 'r') 
    image = Image.open(f) 
    print image # example 1 

    xm_size = 40, 40 
    image.thumbnail(xm_size, Image.ANTIALIAS) 
    f_thumb = storage.open(xm_file_path, "w") 
    print f_thumb # example 2 

    image.save(f_thumb, quality=100) 
    f_thumb.close() 

我的測試:

我得到運行此腳本沒有錯誤。

兩個意見:當我運行print#示例1將打印兩次,print#示例2是空

回答

1

我曾與枕頭的.save()方法使用S3的問題,所以我經歷了去保存前的StringIO。

from django.core.files.storage import default_storage as storage 
from cStringIO import StringIO #for python2, you'd use "from io..." in python3 

# let's say we have a PIL image called 'Image' 
sfile = StringIO() 
Image.save(sfile, format="png") # save a png to the StringIO 
with storage.open('somepath/somefile.png', 'w+') as f: 
    f.write(sfile.getvalue()) 

我在Django 1.9上。我不知道爲什麼這會打破你的升級,但這是我的工作。

+0

感謝您的回覆。我一定會試一試。事實上,使用Django 1.8,枕頭4.0可以正常工作。 django-storage在版本1.1.8和1.2.0之間發生了一些變化。因爲當我使用比django-storage 1.8更新的東西時,上傳不再適用於Django 1.8 ..當我使用django-1.8與django 1.10時,我得到'get_available_name()得到了一個意外的關鍵字參數'max_length'因爲它位於django-storage包中,所以無法覆蓋。 – WayBehind

相關問題