Подтвердить что ты не робот

Загрузите файл apk с S3 с помощью DownloadManager

Есть ли способ загрузить файл из ведра S3 с помощью Android DownloadManager?

В настоящее время я могу загрузить файл apk из Dropbox, делая это:

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-адрес Amazon. Когда я это делаю, загрузка просто остается на 0% и просто застревает там.

Есть ли способ сделать это?

Кстати, URL-адрес Amazon, который я передаю, содержит параметры AWSAccessKeyId, Expires и Signature. URL-адрес выглядит следующим образом:

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

Ответ 1

Причина, по которой это не удается, заключается в том, что вы устанавливаете заголовок Content-Type. Этот заголовок не нужен для загрузки HTTP. Однако, как только он установлен, он должен быть частью сигнатуры в назначенном URL-адресе, как того требует AWS S3. Или вы увидите ошибку 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).

Ответ 2

Здравствуйте, вы можете использовать следующий заголовок, чтобы получить файл 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