2011-12-28 2 views
2

ユーザーはDjangoの管理者から画像をアップロードし、その画像をメモリにクロップして拡大縮小し(おそらくPILを使用して)、ローカルファイルシステムに画像を保存せずにAmazon S3に保存します。私は自分のデータベースにイメージパスを保存しますが、それはローカルに保存されるイメージの唯一の側面です。この特別な画像アップロードウィジェットを管理者編集ページの通常のモデルフォームに統合したいと思います。イメージをDjangoの管理者にアップロードし、トリミングして縮尺し、ファイルをローカルに保存せずにAmazon S3に送信しますか?

This questionは、ソリューションが管理インターフェイスを使用していないことを除いて同様です。

私は保存アクションを傍受し、操作してS3に保存する方法がありますか?イメージパスと残りのモデルデータを通常どおり保存しますか?画像データにアクセスできるだけであれば、画像をトリミングしてS3に保存して保存する方法についてはかなり良い考えがあります。あなたはおそらくチューンFILE_UPLOAD_MAX_MEMORY_SIZEパラメータは、ニーズに合わせてできるよう

答えて

4

は、画像が特定のサイズよりも小さい場合https://docs.djangoproject.com/en/dev/topics/http/file-uploads/#changing-upload-handler-behavior

は、すでにメモリにのみ保存されます参照してください。さらに、これらのアップロードされた画像の.pathフィールドにアクセスしないようにする必要があります。これはファイルに書き出されるためです。代わりに、たとえば.read()メソッドを使用します。私はこれをテストしていませんが、私はこれがうまくいくと信じて:まあ

image = PIL.Image(request.FILES['my_file']) 
+0

これは非常に参考になりますが、私がDjango管理者を使用していた場合、この行をどこに置くのですか? – davidscolgan

+0

あなたはそうしないでしょう。これを行う最も簡単な方法は、画像のサムネイルを作成してフルサイズの画像とともに保存する、例えばThumbnailingImageField(おそらく 'ImageField'のサブクラス)という新しいモデルフィールドを作成することです。 –

+0

また、S3に格納されているviの場合:http://stackoverflow.com/questions/5044982/django-storage-backend-for-s3 –

0

あなたはジャンゴの管理部分に触れることをしたくないならば、あなたは()メソッド保存モデルのスケーリングを定義することができます。 しかし、DjangoでImageFieldを使用しているとき。 Djangoは実際にあなたのために節約を行うことができます。利用可能な高さと幅のオプションがあります。 S3にアップロードするための

https://docs.djangoproject.com/en/dev/ref/models/fields/#imagefield

私は本当にからジャンゴ・ストレージのバックエンドを使用することをお勧め:

https://bitbucket.org/david/django-storages/src(好ましくはS3-のboto版)

あなたは基本的に任意のコードを記述する必要はありませんその方法あなた自身。人々がテストした利用可能なライブラリとソリューションを使用することができます。