2012-02-10 118 views
0

我想在Django中實現一個將客戶端(iPhone應用程序)的圖像上傳到Amazon S3服務器的功能。 iPhone應用程序發送一個HttpRequest(方法PUT)與HTTPBody中的圖像內容。舉例來說,客戶端圖像提出以下網址:http://127.0.0.1:8000/uploadimage/sampleImage.png/使用Django通過PUT文件上傳

我的Django的功能看起來像這樣來處理這樣的PUT請求,將文件保存到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("somepicturebucket") 
    k = Key(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 upload_raw_data(request, name): 
    if request.method == 'PUT': 
     store_in_s3(name,request.raw_post_data) 
     return HttpResponse('Upload of raw data to S3 successful') 
    else: 
     return HttpResponse('Upload not successful') 

我的問題是如何告訴我的功能圖像的名稱。在我的urls.py我有以下,但它不會工作:

url(r'^uploadrawdata/(\d+)/', upload_raw_data), 

現在,據我所知,d +代表數字,所以它是沒有用的,顯然這裏的時候,我通過的名稱一份文件。但是,我想知道這是否是正確的方法。我讀了這篇文章here和它表明下面的代碼行,我不明白,在所有:

file_name = path.split("/")[-1:][0] 

另外,我不知道什麼代碼的其餘部分是怎麼一回事。對於所有這些我都有點新意,所以如何簡單上傳圖片的任何建議都會受到歡迎。謝謝!

回答

1

這個問題並不是真的關於上傳,而且鏈接的答案是不相關的。如果你想接受一個字符串而不是URL中的數字,爲了傳遞一個文件名,你可以在正則表達式中使用w而不是d

編輯澄清對不起,你沒有意識到你試圖傳遞整個文件+擴展名。您可能需要:

r'^uploadrawdata/(.+)/$' 

以便它匹配任何字符。不過,您應該閱讀正則表達式的介紹。

+0

謝謝丹尼爾。但爲什麼相關的答案不相關?它試圖通過PUT進行上傳?我只是覺得我正在做一些根本性錯誤的事情。也許我不應該爲我的目的使用PUT,或者我應該有一些鏈接的答案中的代碼,我不明白... – 2012-02-10 20:27:01

+0

另外,我試過url(r'^ uploadrawdata /(\ w +)/ ',upload_raw_data),但是會收到錯誤消息「當前的URL,uploadrawdata/MD5-HASH-SOMETHING.png/,與這些中的任何一個都不匹配。」當嘗試PUT到http://127.0.0.1:8000/uploadrawdata/MD5-HASH-SOMETHING.png/ – 2012-02-10 20:30:59