使用DownloadManager从S3下载apk文件

时间:2015-07-11 21:59:24

标签: android amazon-web-services amazon-s3

有没有办法使用Android的DownloadManager从S3存储桶下载文件?

我目前可以从Dropbox下载apk文件:

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);

现在我要做的是将“url”替换为我的Amazon URL。当我这样做时,下载只停留在0%并且只是卡在那里。

有没有办法做到这一点?

顺便说一下,我传入的亚马逊网址包含AWSAccessKeyIdExpiresSignature参数。网址如下所示:

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

2 个答案:

答案 0 :(得分:4)

失败的原因是因为您设置了Content-Type标头。 HTTP下载不需要此标头。但是,一旦设置,它就必须按照AWS S3的要求在预签署URL中签署部分签名。否则你会看到403 Forbidden - SignatureDoesNotMatch错误。

快速解决方案是删除Content-Type标题。

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

另一种解决方案是使用您需要的标头生成预签名网址。假设您确实要设置内容类型,可以将其添加到GeneratePresignedUrlRequest,然后从中创建一个URL。

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

有关详细信息,请参阅AmazonS3.generatePresignedUrl(GeneratePresignedUrlRequest)

答案 1 :(得分:1)

您好您可以使用以下标头来获取请求中的apk文件。

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