我有一個關於從客戶端(在這種情況下是iPhone應用程序)上傳到S3的一般性問題。我使用Django在EC2實例上編寫web服務。下面的方法是最低限度,以將文件上傳到S3,它工作得很好,更小的文件(JPG格式或PNG < 1 MB):圖片上傳: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是否成功?
所以一般來說,我不知道我的代碼中的一行是否會在另一行之後執行。例如。什麼時候會火return HttpResponse("Uploading raw data to S3 ...")
?文件仍在上傳或成功上傳後?
感謝您的幫助。另外,我會很感激任何處理這個問題的文檔。我看了O'Reilly的Python & AWS Cookbook中的章節,但由於它只是代碼示例,它並不能真正回答我的問題。
謝謝,這真的很有幫助。我剛剛檢查了幾個其他帖子,似乎最好的解決方案是將客戶端(iPhone)的東西直接上傳到S3。這將使服務器快捷 - 並且不會像我所見到的那樣創建雙倍的流量(即,首先上傳到EC2/Django,然後上傳到S3)。 – 2012-02-18 09:36:05
沒錯,唯一需要注意的是如果您對上傳的圖像進行了任何處理。在我的業務中,每個圖像在Django服務器上調整爲各種不同的大小,然後將每個圖像上傳到CDN。只是一個例子,但要記住你自己的應用程序。 – Jordan 2012-02-18 09:39:24
我明白了。因此,如果我不在服務器上處理圖像,那麼直接使用Client-> S3即可。如果我需要做一些處理,我會通過Django服務器。非常感謝,這真的很有幫助。 – 2012-02-18 09:42:56