有没有办法使用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%并且只是卡在那里。
有没有办法做到这一点?
顺便说一下,我传入的亚马逊网址包含AWSAccessKeyId
,Expires
和Signature
参数。网址如下所示:
https://bucket-name.s3-us-west-2.amazonaws.com/uploads/app/apk/22/app.apk?AWSAccessKeyId=""&Expires=""&Signature=""
答案 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