2017-03-03 12 views
0

Django 1.8からDjango 1.10にアップグレードされましたが、いくつか明らかな課題がありましたが、唯一の苦労はS3への画像アップロードです。 Djangoをアップグレードしている間に、私はまた、Boto & PILをアップグレードすることを余儀なくされました。Django Django 1.10へのアップグレード後に画像がAWS S3にアップロードされない1.10

しかし、元の画像は依然として要求されたバケット(オリジナル)に正しくアップロードされますが、サムを作成して別のバケットに保存する保存機能は機能しなくなりました。ジャンゴ/後のBoto/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() 

私のテスト:

私はこのスクリプトを実行しているエラーを取得していません。

2つの観測:私はprintを実行すると、1は2を二回印刷しprint上#exampleう#exampleが、私はS3使用して枕の.save()方法に問題があったので、私は通過した空

答えて

1

です保存する前に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

お返事ありがとうございます。私は間違いなくそれを試してみます。実際には、枕4.0はDjango 1.8で正常に動作しています。バージョン1.1.8とバージョン1.2.0の間で、ジャンゴストレージのいくつかの変更がありました。 django-1.8よりも新しいものを使用しているときにアップロードがDjango 1.8で機能しなくなったためです。django-1.orをdjango 1.10で使用すると、 'get_available_name()に予期しないキーワード引数 'max_length''エラーが出ますdjango-storageパッケージの中にあるので上書きすることはできません。 – WayBehind

関連する問題