gpt4 book ai didi

android - 使用 DownloadManager 从 S3 下载 apk 文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:46:51 26 4
gpt4 key购买 nike

有没有办法使用 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 替换“url”。当我这样做时,下载量只停留在 0% 并且卡在那里。

有什么办法吗?

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

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

最佳答案

它失败的原因是因为您设置了 Content-Type header 。 HTTP 下载不需要此 header 。但是,一旦设置,它就必须成为预签名 URL 中签名的一部分,如 AWS S3 所要求的那样。否则您将看到 403 Forbidden - SignatureDoesNotMatch 错误。

快速的解决方案是删除 Content-Type header 。

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

另一种解决方案是生成一个包含您需要的 header 的预签名 URL。假设您真的想设置内容类型,您可以将其添加到 GeneratePresignedUrlRequest,然后从中创建一个 URL。

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

参见 AmazonS3.generatePresignedUrl(GeneratePresignedUrlRequest)了解更多详情。

关于android - 使用 DownloadManager 从 S3 下载 apk 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31362249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com