2015-07-11 3 views
11

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

Я в настоящее время скачать файл из 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="" 
+0

Вы пробовали простой HTTP вместо HTTPS? Вы пытались получить доступ к URL-адресу в приложении веб-браузера на устройстве или эмуляторе, на котором вы тестируете? Пробовали ли вы URL-адрес для общедоступного ресурса (т. Е. Тот, который не требует какого-либо из этих параметров запроса)? Это всего лишь некоторые идеи, чтобы немного уменьшить проблему. – CommonsWare

+0

@CommonsWare Я просто попробовал некоторые из предложенных вами вещей. Загрузка выполняется, если я нажму кнопку «сделать общедоступной» в файле в своем ведре S3. Это устраняет необходимость в параметрах. Поэтому я предполагаю, что проблема связана с моими учетными данными AWS? Файл загружается в моем браузере на моем компьютере, хотя с учетными данными в ссылке. – theDazzler

+0

«Итак, я предполагаю, что проблема связана с моими учетными данными AWS?» - Я никогда не пробовал URL с параметрами запроса с помощью 'DownloadManager'. Я бы подумал, что 'DownloadManager' будет поддерживать его. Взгляните на анализируемые 'Uri' и такие вещи, как' getQuery() 'или' getQueryParameters() 'и убедитесь, что ваши значения не скремблируются где-то на этом пути. – CommonsWare

ответ

4

Причина она не потому, что вы установите заголовок 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).

+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 
Смежные вопросы