【发布时间】:2015-09-30 11:17:58
【问题描述】:
有没有办法使用 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% 并卡在那里。
有没有办法做到这一点?
顺便说一下,我传入的亚马逊网址包含AWSAccessKeyId、Expires和Signature参数。网址如下所示:
https://bucket-name.s3-us-west-2.amazonaws.com/uploads/app/apk/22/app.apk?AWSAccessKeyId=""&Expires=""&Signature=""
【问题讨论】:
-
您是否尝试过纯 HTTP 而不是 HTTPS?您是否尝试过在您正在测试的设备或模拟器上的 Web 浏览器应用程序中访问 URL?您是否尝试过用于公共资源的 URL(即,不需要任何这些查询参数的 URL)?这些只是一些可能缩小问题范围的想法。
-
@CommonsWare 我刚刚尝试了你建议的一些事情。如果我单击 S3 存储桶中文件上的“公开”选项,则下载有效。这消除了对参数的需求。所以我假设问题与我的 AWS 凭证有关?尽管链接中有凭据,但该文件确实会下载到我计算机上的浏览器中。
-
“所以我假设问题与我的 AWS 凭证有关?” -- 我从未尝试过带有
DownloadManager的查询参数的URL。我会认为DownloadManager会支持它。查看已解析的Uri和getQuery()或getQueryParameters()之类的内容,并确保您的值在此过程中不会被打乱。 -
@CommonsWare 好的,我刚刚查看了解析的 Uri 以及 getQueryParamters() 和 getQuery() 中的所有内容,一切似乎都很好。奇怪的是,我从来没有从 DownloadManager 得到错误或任何东西。它只是挂起。我想我会得到类似 401 或 403 错误之类的东西。
-
如果您可以找到其他一些涉及查询参数(不是 S3)的下载 URL,请试一试。如果失败,那么
DownloadManager可能对查询参数有限制。如果它成功了,那么DownloadManager和 S3 之间涉及这些查询参数的握手就是罪魁祸首,尽管我真的不知道你会从那里去哪里。
标签: android amazon-web-services amazon-s3