0

Я создаю приложение в NodeJS, которое хранит файлы в Amazon S3, используя Knox S3 client. Все работает хорошо для загрузки файлов, перемещения файлов и т. Д.Аутентификация строки запроса Amazon S3 отменяет загрузку?

Теперь я хочу использовать механизм Query String Authentication, чтобы разрешить прямую загрузку файлов. Для этого у меня есть код на моем вызове NodeJS-сервера в библиотеке Knox и создайте подписанный URL-адрес.

код выглядит следующим образом:


exports.getS3Policy = function(file) { 
    var date = moment().add("min", 60).toDate(); 
    var expires = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); 

    return knoxClient.signedUrl(file, expires); 
}; 

Этот код возвращает правильный URL с параметрами аутентификации. Например:

https://my-bucket.s3.amazonaws.com/some/folder/file.ext?Expires=1234567890&AWSAccessKeyId=ABCDEFGHIJKLMNO&Signature=someEncodedSignature

Согласно всем документам, которые я прочитал, что это правильный URL. Я не получаю никаких ошибок от Amazon с этим URL. Истечение срока действия является правильным (я могу проверить это, создав истечение 1 секунды, а затем получив истекшую ошибку). Путь к файлу правильный.

Когда я ударил URL-адрес в своем браузере, мой браузер (последний Chrome OSX) отменяет загрузку файла, хотя я получаю ответ 200 ok с информацией о правильном файле.

Вот копия информации запроса от Девых инструментов Chrome (чувствительных бит заменены):


Request URL:https://my-bucket.s3.amazonaws.com/some/folder/file.ext?Expires=1234567890&AWSAccessKeyId=ABCDEFGHIJKLMNO&Signature=someEncodedSignature 
Request Method:GET 
Status Code:200 OK 
Request Headers 
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Cache-Control:no-cache 
Connection:keep-alive 
DNT:1 
Host:my-bucket.s3.amazonaws.com 
Pragma:no-cache 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.65 Safari/537.36 
Query String Parameters 
Expires:1234567890 
AWSAccessKeyId:ABCDEFGHIJKLMNO 
Signature:someEncodedSignature 
Response Headers 
Accept-Ranges:bytes 
Content-Length:341390 
Content-Type:application/octet-stream 
Date:Tue, 10 Sep 2013 13:22:55 GMT 
ETag:"fc4d24e752097f212e111f2736af7162" 
Last-Modified:Tue, 10 Sep 2013 01:40:31 GMT 
Server:AmazonS3 
x-amz-id-2:some-id 
x-amz-request-id:some-request-id 

Как вы можете видеть, ответ сервера «200 ОК». content-length из 341390 также является правильной длиной файла, который я пытаюсь загрузить, - это фактический размер файла. Я получаю тип контента как «приложение/октет-поток», потому что так я сказал S3, чтобы хранить файлы ... Я просто хочу, чтобы загрузка была загружена в основном.

Но после получения ответа от S3 Chrome отменяет загрузку. Вот ScreenCap из Devtools, снова:

FireFox и Safari как скачать файл, как и ожидалось. Почему хром отменяет загрузку? Что я делаю не так? Это тип контента? или ?

ответ

1

Конечно, я нашел ответ, как только я отправляю вопрос ... это ошибка в Chrome

https://code.google.com/p/chromium/issues/detail?id=104331

Исправление будет доступна, начиная с Chrome/Chromium 30.x. Пожалуйста, откройте новую проблему, если вы видите похожие проблемы с версиями Chrome 30 или выше.

Поддерживаемые средства, указывающее, что ресурс должен быть загружен должен использовать поле заголовка Content-Disposition (http://tools.ietf.org/html/rfc6266).

Похоже, мне нужно получить S3, чтобы установить content-disposition в ответ.