2015-07-11 21 views
11

Có cách nào để tải tệp xuống từ thùng S3 bằng Trình tải xuống của Android không?Tải xuống tệp apk từ S3 bằng cách sử dụng DownloadManager

Tôi hiện có thể tải về một tập tin apk từ Dropbox làm điều này:

DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); 

request.addRequestHeader("Content-Type", "application/vnd.android.package-archive"); 
request.setMimeType("application/vnd.android.package-archive"); 

final DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
final long id = manager.enqueue(request); 

Bây giờ những gì tôi muốn làm là thay thế "url" với URL Amazon của tôi. Khi tôi làm điều này, việc tải xuống chỉ ở mức 0% và chỉ bị kẹt ở đó.

Có cách nào để thực hiện việc này không?

Nhân tiện, URL Amazon tôi chuyển vào chứa các thông số AWSAccessKeyId, ExpiresSignature. Url trông giống như sau:

https://bucket-name.s3-us-west-2.amazonaws.com/uploads/app/apk/22/app.apk?AWSAccessKeyId=""&Expires=""&Signature="" 
+0

Bạn đã thử HTTP đơn giản thay vì HTTPS chưa? Bạn đã thử truy cập URL trong ứng dụng trình duyệt web trên thiết bị hoặc trình giả lập mà bạn đang thử nghiệm chưa? Bạn đã thử một URL dành cho tài nguyên công cộng (tức là một URL không yêu cầu bất kỳ tham số truy vấn nào)? Đó chỉ là một số ý tưởng để có thể thu hẹp vấn đề xuống một chút. – CommonsWare

+0

@CommonsWare Tôi vừa thử một số điều bạn đề xuất. Tải xuống hoạt động nếu tôi nhấp vào tùy chọn "công khai" trên tệp trong thùng S3 của tôi. Điều đó loại bỏ sự cần thiết cho các tham số. Vì vậy, tôi giả định vấn đề là bằng cách nào đó liên quan đến các thông tin AWS của tôi? Tệp tải xuống trong trình duyệt của tôi trên máy tính của tôi mặc dù có thông tin đăng nhập trong liên kết. – theDazzler

+0

"Vì vậy, tôi giả định vấn đề là bằng cách nào đó liên quan đến thông tin đăng nhập AWS của tôi?" - Tôi chưa bao giờ thử một URL với tham số truy vấn bằng 'DownloadManager'. Tôi sẽ * nghĩ rằng 'DownloadManager' sẽ hỗ trợ nó. Xem nhanh phân tích 'Uri' và các công cụ như' getQuery() 'hoặc' getQueryParameters() 'và đảm bảo rằng các giá trị của bạn không bị xáo trộn ở đâu đó trên đường đi. – CommonsWare

Trả lời

4

Lý do không thành công là vì bạn đặt tiêu đề Content-Type. Tiêu đề này không cần thiết để tải xuống HTTP. Tuy nhiên, một khi được thiết lập, nó phải là một phần của chữ ký trong URL được chỉ định, theo yêu cầu của AWS S3. Hoặc nếu không bạn sẽ thấy 403 Cấm - SignatureDoesNotMatch lỗi.

Giải pháp nhanh chóng là xóa tiêu đề Content-Type.

request.addRequestHeader("Content-Type", "application/vnd.android.package-archive"); 

Một giải pháp khác là tạo URL được chỉ định với tiêu đề bạn cần. Giả sử bạn thực sự muốn đặt loại nội dung, bạn có thể thêm nó vào GeneratePresignedUrlRequest và sau đó tạo một URL từ nó.

GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucket, key); 
request.setContentType("application/vnd.android.package-archive"); 
URL url = s3Client.generatePresignedUrl(request); 

Xem AmazonS3.generatePresignedUrl(GeneratePresignedUrlRequest) để biết thêm chi tiết.

+0

Rất tiếc. Cảm ơn điều này đã làm việc.Bạn nói đây là giải pháp "nhanh". Có bất kỳ vấn đề liên quan đến giải pháp này tôi nên tìm cho ra? Có giải pháp "dài hơn" tốt hơn không? Tôi không có vấn đề với giải pháp của bạn, nhưng chỉ cần tự hỏi nếu có bất cứ điều gì tôi cần phải nhận thức được. – theDazzler

+0

Xem câu trả lời cập nhật. – Yangfan

1

Xin chào Bạn có thể sử dụng tiêu đề sau để tải tệp APK theo yêu cầu.

Accept-Encoding:gzip, deflate 
Accept-Language:en-US,en;q=0.8 
Cache-Control:no-cache 
Connection:keep-alive 
Content-Length:819457 
Content-Type:application/octet-stream 
Các vấn đề liên quan