2015-07-11 194 views
11

有没有办法使用Android的DownloadManager从S3存储桶下载文件?使用DownloadManager从S3下载apk文件

我目前可以从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); 

现在我想做的事就是我的亚马逊网址替换“网址”。当我这样做时,下载只停留在0%,并且只是停留在那里。

有没有办法做到这一点?

顺便说一下,我通过的Amazon URL包含AWSAccessKeyId,ExpiresSignature参数。该网址看起来像这样:

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

您是否尝试过纯HTTP而不是HTTPS?您是否尝试过在您正在测试的设备或模拟器上的Web浏览器应用程序中访问URL?您是否尝试了一个用于公共资源的URL(即,不需要任何这些查询参数的URL)?这些只是一些想法,可能会缩小问题的范围。 – CommonsWare

+0

@CommonsWare我刚刚尝试了一些你建议的事情。如果我点击我的S3存储桶中的文件选项“公开”,下载工作。这消除了参数的需要。所以我假设这个问题与我的AWS凭证相关?尽管使用链接中的凭证,该文件在我的计算机上的浏览器中下载。 – theDazzler

+0

“所以我假设问题与我的AWS凭证有关?” - 我从来没有用'DownloadManager'试过带查询参数的网址。我会*认为''DownloadManager'会支持它。看一下解析过的'Uri'和getQuery()''''''getQueryParameters()'等东西,并确保你的值不会在一路上被扰乱。 – CommonsWare

回答

4

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

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

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

另一种解决方案是生成一个带有所需标题的预先设置的URL。假设你真的想设置内容类型,你可以将它添加到GeneratePresignedUrlRequest然后从它创建一个URL。

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

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

+0

哇。感谢这工作。你说这是“快速”解决方案。这个解决方案有什么问题需要注意?是否有更好的“更长”解决方案?我对您的解决方案没有任何问题,但只是想知道是否有任何我应该注意的问题。 – theDazzler

+0

查看更新的答案。 – Yangfan

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