2012-10-19 33 views
5

Kullanıcıların satın aldıkları MP3 dosyalarını indirmelerine ve bu MP3 dosyalarının Amazon S3'te barındırılmasına izin veren bir Django uygulamasına sahibim. Kullanıcılar bir "indirme" düğmesine tıkladığında, orijinal bağlantıyı (Amazon'a) görmelerine izin vermeden indirmeyi nasıl zorlayabilirim? Dosyayı indiren ancak dosyanın bozuk olduğu bir görünüm var. İşte benzediğini nasıl:Django ile Amazon S3'ten dosya indirme

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

gibi bir şey bunu kontrol ettiniz mi? https://forums.aws.amazon.com/message.jspa?messageID=257743 – sergzach

cevap

6

Dosyaların indirilebilir olmak istemiyorsanız, set ACL özel (hesabınız üzerinden erişilebilir) olmak. Kullanıcılarınız hala indirilebilecek URL'yi sağladığından dosyayı indirebilir. Bir URL’yi imzaladığınızda, zaman aşımına uğramış bir süre ile jeton üretirsiniz. 10 dakika kadar makul bir şeye ayarlayabilirsiniz. Amazon Web Services interface for Python — Boto kullanın.

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) 

Not bu güvenli olduğunu, hem belirteç sadece tek bir istek yöntemi (varsayılan olarak GET) ve yalnızca tek bir dosya için geçerlidir. Öyleyse, örneğin başka dosyaları indirmek veya verilen dosyayı işlemek için belirteci yeniden kullanma riski yoktur.

+0

Bunu denedim ama sonra 'bucket = conn.get_bucket ('my_bucket')' 'S3ResponseError: S3ResponseError: 403 Yasak 'hatası alıyorum mesaj etiketinde '' İstek zamanı ile geçerli saat arasındaki fark çok büyüktür. ' –

+0

@Mohamed: Yerel makinenizdeki saat senkronize değil. Örneğin, [NTP] (http://en.wikipedia.org/wiki/Network_Time_Protocol) kullanarak otomatik senkronizasyon kurmalısınız. – vartec

+0

Django yönetici panelinden dosya yüklemek için AS3 kullanmayı denediğimde aynı hatayı alıyorum, sorunun hala senkronizasyon dışı kaldığını düşünüyor musunuz? –

6

Bunu nasıl yapacağımı belirten bir yeri bulamadım ve aradığımda bu soruya ve tekrar aradım. Yani

boto arka uç kullanarak django-depoları ile

, Bunu yapmanın yolu

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

Bunun şu anda django depolarına yerleşik olduğunu keşfettim. Yukarıdaki örneğinizi takip ederek, şu şekilde yapılabilir: "url = storage.url (dosya yolu, başlıklar = response_headers)" – robhudson