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,Expires和Signature参数.网址如下所示:
https://bucket-name.s3-us-west-2.amazonaws.com/uploads/app/apk/22/app.apk?AWSAccessKeyId=""&Expires=""&Signature=""
Run Code Online (Sandbox Code Playgroud)
失败的原因是因为您设置了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) 。
| 归档时间: |
|
| 查看次数: |
1523 次 |
| 最近记录: |