2012-10-19 156 views
5

我有一個Django應用程序,允許用戶下載他們購買的MP3文件,並將這些MP3文件託管在Amazon S3中。當用戶點擊「下載」按鈕而不允許他們查看原始鏈接(對亞馬遜)時,我如何強制下載? 我有一個下載文件但文件已損壞的視圖。 這裏是如何看起來像:使用Django從Amazon S3下載文件

def download(request): 
    filename = 'https://s3-eu-west-1.amazonaws.com/skempi/Ihsahn/04-emancipation-qtxmp3.mp3' 
    response = HttpResponse(mimetype='application/force-download') 
    response['Content-Disposition']='attachment;filename="%s"'%filename 
    response["X-Sendfile"] = filename 
    return response 
+1

你檢查了這一點? https://forums.aws.amazon.com/message.jspa?messageID=257743 – sergzach

回答

6

如果你不想要的文件被下載,設置ACL是私有(只能通過您的帳戶訪問)。您的用戶將仍然能夠下載文件,您是否向他們提供簽名的URL。當您簽署一個URL時,您會生成具有過期時間的令牌。您可以將其設置爲10分鐘合理的值。使用Amazon Web Services interface for Python — Boto

import boto 
conn = boto.connect_s3('<aws access key>', '<aws secret key>') 
bucket = conn.get_bucket('your_bucket') 
s3_file_path = bucket.get_key('path/to/file') 
url = s3_file_path.generate_url(expires_in=600) # expiry time is in seconds 

return HttpResponseRedirect(url) 

請注意,這是安全的,因爲令牌僅僅適用於一個請求方法(默認爲GET),只有一個文件。因此,不會有人重複使用令牌,例如下載其他文件或操作給定的文件。

+0

我試過這個,但後'bucket = conn.get_bucket('my_bucket')'我得到一個'S3ResponseError:S3ResponseError:403 Forbidden'錯誤和在消息標記中有'請求時間和當前時間之間的差異太大。' –

+0

@穆罕默德:您的本地計算機上的時間不同步。您應該使用例如[NTP](http://en.wikipedia.org/wiki/Network_Time_Protocol)設置自動同步。 – vartec

+0

當我嘗試使用AS3從Django管理面板上傳文件時,出現同樣的錯誤,您是否認爲問題仍然與時間不同步 –

6

我找不到指定如何做到這一點的任何地方,並最終回到這個問題,當我搜索時,又一次。所以

隨着使用博託後端Django的倉庫,要做到這一點的方式是一樣的東西

filepath = settings.MEDIA_DIRECTORY + file.name 
response_headers = { 
    'response-content-type': 'application/force-download', 
    'response-content-disposition':'attachment;filename="%s"'%file.name 
    } 
url = s3.generate_url(60, 'GET', 
       bucket=settings.AWS_STORAGE_BUCKET_NAME, 
       key=filepath, 
       response_headers=response_headers, 
       force_http=True) 
return http.HttpResponseRedirect(url) 
+3

我發現這是目前內置於django-storages。按照上面的例子,可以這樣做:'url = storage.url(filepath,headers = response_headers)' – robhudson

相關問題