1

Django-Cumulus を使用して、画像を Rackspace の Cloudfiles プラットフォームに保存しています。

画像を動的に操作し、モデルの新しい ImageField として保存したいと考えています。たとえば、次の ImageFields を持つ Photo モデルがあります: image、thumb_256x256

私のフォームの save() メソッドでは、ユーザーが (JCrop を使用して) 切り取り場所を指定できるようにしています。

とにかく、ユーザーがアップロードした既存の画像ファイルを取得する方法を知っています。また、PIL で操作を適用する方法も知っています。私が直面している問題は、新しい Rackspace ファイルを作成して書き込むことです。

「NoSuchObject」という例外が発生し続けます。

コード例を次に示します。

def save(self, commit=True):
    """ Override the Save method to create a thumbnail of the image. """
    m = super(PhotoUpdateForm, self).save(commit=False)

    image = Image.open(m.image.file)
    image.thumbnail((256,256), Image.ANTIALIAS)
    thumb_io = CloudFilesStorageFile(storage=CLOUDFILES_STORAGE, name='foo/bar/test.jpg')
    image.save(thumb_io.file, format='JPEG')

また、この時点に到達したら、この画像をモデルの他の ImageField に設定する最良の方法は何ですか? (私の場合はm.thumb_256x256)

ありがとうございます!

更新: 私が使用している実際の Cloudfiles Django アプリの名前は「django-cumulus」です

4

1 に答える 1

0

これが一時的な解決策です。新しいファイル名を正しく設定する際に問題が発生しました。ファイル名に_Xを追加するだけです。したがって、たとえば、新しいバージョンを保存するたびに、somefilename.jpgはsomefilename_1.jpgになります。

このコードは少し醜いですが、仕事を成し遂げます。画像のトリミングされたバージョンを作成し、必要に応じてサムネイルも生成します。

def save(self, commit=True):
    """ Override the Save method to create a thumbnail of the image. """
    m = super(PhotoUpdateForm, self).save(commit=False)

    # Cropped Version
    if set(('x1', 'x2', 'y1', 'y2')) <= set(self.cleaned_data):
        box = int(self.cleaned_data['x1']), \
              int(self.cleaned_data['y1']), \
              int(self.cleaned_data['x2']), \
              int(self.cleaned_data['y2'])
        image = Image.open(m.image.file)
        image = image.crop(box)
        temp_file = NamedTemporaryFile(delete=True)
        image.save(temp_file, format="JPEG")
        m.image.save("image.jpg", File(temp_file))
        cropped = True # Let's rebuild the thumbnail

    # 256x256 Thumbnail
    if not m.thumb_256x256 or cropped:
        if not image:
            image = Image.open(m.image.file)
        image.thumbnail((256,256), Image.ANTIALIAS)
        temp_file = NamedTemporaryFile(delete=True)
        image.save(temp_file, format="JPEG")
        m.thumb_256x256.save("thumbnail.jpg", File(temp_file))

    if commit: m.save()
    return m
于 2012-06-17T01:08:36.500 に答える