使用DownloadManager从S3下载apk文件

the*_*ler 11 android amazon-s3 amazon-web-services

有没有办法使用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);
Run Code Online (Sandbox Code Playgroud)

现在我想做的是用我的亚马逊URL替换"url".当我这样做时,下载只停留在0%并且只是卡在那里.

有没有办法做到这一点?

顺便说一句,亚马逊的URL我通过在包含AWSAccessKeyId,ExpiresSignature参数.网址如下所示:

https://bucket-name.s3-us-west-2.amazonaws.com/uploads/app/apk/22/app.apk?AWSAccessKeyId=""&Expires=""&Signature=""
Run Code Online (Sandbox Code Playgroud)

Yan*_*fan 4

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

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

request.addRequestHeader("Content-Type", "application/vnd.android.package-archive");
Run Code Online (Sandbox Code Playgroud)

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

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

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