14

バックグラウンド

私はDjangoでかなり大きなファイルのアップロードを行っています。ファイルサイズは通常10MB-100MBです。

Herokuを使用していて、リクエストのタイムアウトが30秒に達しています。

始まり

制限を回避するために、Herokuの推奨事項は、ブラウザーからS3に直接アップロードすることです。

Amazonは、アップロードを実行するためのHTMLフォームを作成する方法を示すことにより、これを文書化します。

私はDjangoを使用しているので、HTMLを手動で作成するのではなく、django-uploadify-s3)を使用しています。これにより、実際のアップロードを実行するJSでラップされたSWFオブジェクトが提供されます。

この部分は正常に機能しています。やったー!

問題

問題は、そのデータを正常な方法でDjangoモデルに結び付けることです。現在、データはファイルの場所を指す単純なURL文字列として返されます。

ただし、以前はdjango-storagesのS3 Botoを使用して、すべてのファイルをとして管理していFileFieldsましたS3BotoStorageFile

繰り返しになりますが、S3 Botoは単独でうまく機能し、Uploadifyは単独でうまく機能しています。問題は、この2つを組み合わせることにあります。

私の理解では、にデータを入力する唯一の方法は、ファイル名とファイルの内容FileFieldの両方を提供することです。ブラウザからDjangoにファイルをアップロードする場合、Djangoはファイルの内容をバッファに入れて、好きなように実行できるため、これは問題ありません。ただし、私のようにS3に直接アップロードする場合、Djangoはファイル名とURLのみを受け取り、バイナリデータは受け取らないため、を正しく入力できません。FieldFile

助けを呼ぶ

S3BotoのFileFieldをS3への直接アップロードと組み合わせて使用​​する優雅な方法を知っている人はいますか?

それ以外の場合、URLだけに基づいてS3ファイルを管理するための最良の方法は何ですか?有効期限、キーIDなどの設定を含みます。

どうもありがとう!

4

6 に答える 6

1

URLFieldを使用します。

于 2012-03-19T01:15:30.783 に答える
1

FileFieldを直接使用してファイルをs3に保存するか、ユーザーがURLを直接入力するオプションがあるという同様の問題がありました。それを回避するために、モデルで 2 つのフィールドを使用しました。1 つは FileField 用で、もう 1 つは URLField 用です。そして、テンプレートでは、「または」を使用してどれが存在するかを確認し、{{ instance.filefield または instance.url }} のように使用できます。

于 2012-04-22T14:38:23.023 に答える
1

これはテストされていませんが、次のものを使用できるはずです。

from django.core.files.storage import default_storage
f = default_storage.open('name_you_expect_in_s3', 'r')
#f is an instance of S3BotoStorageFile, and can be assigned to a field
obj, created = YourObject.objects.get_or_create(**stuff_you_know)
obj.s3file_field = f
obj.save()

これにより、コンテンツを上書きすることなく、s3へのローカルポインターを設定して保存する必要があると思います。

ETA: S3 でアップロードが完了し、s3 のキーがわかっている場合にのみ、これを行う必要があります。

于 2013-10-29T17:00:14.310 に答える
0

django-filetransfers をチェックアウトします。django-storages でうまく機能するようです。

于 2013-07-02T18:35:38.913 に答える
-1

ここでは、実際の SQL を書くことが最も簡単な解決策かもしれないと考えています。あるいは、S3BotoStorage をサブクラス化し、_save メソッドをオーバーライドして、他のすべての保存処理を回避し、cleaned_name を返すだけのファイルパスのオプションの kwarg を許可することもできます。

于 2012-08-19T06:55:28.920 に答える
-1

私はdjangoを使用したことがないので、ymmv :)しかし、コンテンツを入力するために1バイトだけを記述しないのはなぜですか? そうすれば、引き続き FieldFile を使用できます。

于 2012-03-16T00:00:04.870 に答える