2012-02-17 19 views
3

クライアント(この場合はiPhoneアプリ)からS3へのアップロードに関する一般的な質問があります。私はDjangoを使用して、EC2インスタンスでWebサービスを作成しています。以下の方法は、S3にファイルをアップロードするために最低限であり、小さいファイル(JPGのみまたはPNG画像< 1メガバイト)と非常によく動作します:画像アップロード:iPhoneクライアント - Django - S3

def store_in_s3(filename, content): 
    conn = S3Connection(settings.ACCESS_KEY, settings.PASS_KEY) # gets access key and pass key from settings.py 
    bucket = conn.create_bucket('somebucket') 
    k = Key(bucket) # create key on this bucket 
    k.key = filename 
    mime = mimetypes.guess_type(filename)[0] 
    k.set_metadata('Content-Type', mime) 
    k.set_contents_from_string(content) 
    k.set_acl('public-read') 

def uploadimage(request, name): 
    if request.method == 'PUT': 
     store_in_s3(name,request.raw_post_data) 
     return HttpResponse("Uploading raw data to S3 ...") 
    else: 
     return HttpResponse("Upload not successful!") 

私はまだこのすべてに非常に新しいので、私ここで何が起こるのか理解していない。その場合ですか?

  • Djangoはファイルを受信し、それをEC2インスタンスのメモリに保存しますか?
  • raw_post_dataの使用を避け、メモリの問題を避けるためにチャンクを行うべきですか?
  • Djangoがファイルを受け取ったら、そのファイルを関数store_in_s3に渡しますか?
  • S3へのアップロードが成功したかどうかはどのようにわかりますか?

一般に、私のコードの1行が次々に実行されるのだろうかと思います。例えば。いつreturn HttpResponse("Uploading raw data to S3 ...")火災?ファイルがまだアップロードされている間、またはアップロードが正常に完了した後ですか?

ありがとうございました。また、私はこの主題を扱うすべての文書に感謝します。私は、O'ReillyのPython & AWS Cookbookの章を見てきましたが、それはコードサンプルなので、私の質問には本当に答えません。

答えて

1

Djangoは小さなアップロードファイルをメモリに保存します。特定のサイズを超えて、ディスク上の一時ファイルに格納します。

はい、チャンキングは、同様に、メモリの節約のために有用である:

for file_chunk in uploaded_file.chunks(): 
    saved_file.write(file_chunk) 

これらの操作のすべてが同期しているので、それはS3に保管しようとする前に、ファイルが完全にアップロードされるまで、Djangoは待機します。 S3はあなたのHttpResponse()を受け取る前にDjangoとS3を通してアップロードされることが保証されていますので、アップロードを完了しなければなりません。

DjangoのFile Uploadsにはたくさんの素晴らしい情報がありますさまざまなアップロード状況を処理する方法。

+0

本当に助かりました。私はちょうど他のいくつかの投稿をチェックして、クライアント(iPhone)からS3に直接アップロードするのが最善の解決策であるかのように思えます。これはサーバーをショートカットし、私が見る限り、トラフィックを2倍には作成しません(つまり、最初にEC2/DjangoにアップロードしてS3にアップロードします)。 –

+1

あなたが話している唯一の警告は、アップロードされた画像の処理を行う場合です。私のビジネスでは、各イメージはDjangoサーバー上でさまざまなサイズにリサイズされ、それぞれがCDNにアップロードされます。ちょっとした例ですが、自分のアプリに留意してください。 – Jordan

+0

私は参照してください。だから私はサーバー上の画像の処理をしない場合、行く方法は直接クライアント→S3です。何らかの処理が必要な場合は、Djangoサーバーを経由します。もう一度ありがとう、これは本当に役に立ちました。 –

1

あなたは、django-storageを見ることができます。それは、S3と他のサービス/プラットフォームの束にファイルを格納することを容易にします。

+0

ありがとうKeith。私はちょうど他のいくつかの投稿をチェックして、ちょうどDjangoを経由せずにクライアント(iPhone)からS3に直接アップロードする必要があるかのように見えます。その場合、私はdjango-storageを必要としません。しかし、私に知らせてくれてありがとう。 –

関連する問題