2012-10-19 31 views
5

Tôi có ứng dụng Django cho phép người dùng tải xuống các tệp MP3 mà họ đã mua và các tệp MP3 này được lưu trữ trong Amazon S3. Làm thế nào tôi có thể bắt buộc tải xuống khi người dùng nhấp vào nút "tải xuống" mà không cho phép họ xem liên kết gốc (đến Amazon)? Tôi có chế độ xem tải xuống tệp nhưng tệp bị hỏng. Sau đây là cách nó trông giống như:Tải xuống tệp từ Amazon S3 với Django

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

Bạn đã kiểm tra này? https://forums.aws.amazon.com/message.jspa?messageID=257743 – sergzach

Trả lời

6

Nếu bạn không muốn các tập tin được tải về, thiết lập ACL là riêng tư (chỉ truy cập thông qua tài khoản của bạn). Người dùng của bạn sẽ vẫn có thể tải xuống tệp là bạn cung cấp cho họ URL đã ký. Khi bạn đăng nhập một URL, bạn tạo mã thông báo với thời gian hết hạn. Bạn có thể đặt nó vào một cái gì đó hợp lý như 10 phút. Sử dụng 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) 

Lưu ý, điều này an toàn vì mã thông báo chỉ hợp lệ cho một phương thức yêu cầu (GET theo mặc định) và chỉ cho một tệp. Vì vậy, không có nguy cơ ai đó sử dụng lại mã thông báo để tải xuống các tệp khác hoặc thao tác tệp được cung cấp.

+0

Tôi đã thử điều này nhưng sau 'bucket = conn.get_bucket ('my_bucket')' Tôi nhận được lỗi 'S3ResponseError: S3ResponseError: 403 Forbidden' và trong thẻ tin nhắn có 'Sự khác biệt giữa thời gian yêu cầu và thời gian hiện tại quá lớn.' –

+0

@Mohamed: thời gian trên máy cục bộ của bạn không đồng bộ. Bạn nên thiết lập đồng bộ hóa tự động bằng cách sử dụng ví dụ [NTP] (http://en.wikipedia.org/wiki/Network_Time_Protocol). – vartec

+0

Tôi nhận được lỗi tương tự khi tôi cố gắng sử dụng AS3 để tải lên tệp từ bảng điều khiển quản trị Django, bạn có nghĩ rằng vấn đề vẫn còn trong thời gian không đồng bộ –

6

Tôi không thể dễ dàng tìm thấy bất kỳ nơi nào chỉ định cách thực hiện việc này và kết thúc lại vào thời điểm này và một lần nữa khi tôi tìm kiếm. Vì vậy,

Với django-kho bằng cách sử dụng phụ trợ boto, cách để làm điều này là một cái gì đó giống như

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

Tôi phát hiện ra rằng đây là hiện đang được xây dựng trong django-storages. Theo ví dụ trên của bạn, điều này có thể được thực hiện như sau: 'url = storage.url (filepath, headers = response_headers)' – robhudson

Các vấn đề liên quan