2

Несколько строк (ниже) генерируют подписанный URL-адрес, на который браузер перенаправляется, чтобы загрузить файл с S3.AWS S3: Загрузка файла Force с использованием 'response-content-disposition'

Я столкнулся с известной проблемой Chrome, не загружающей PDF-файлы с S3, когда тип контента установлен как октетный поток.

Решение состоит в том, чтобы заставить хром загружать файл, а не пытаться его читать и открывать.

Я попробовал добавить «response-content-disposition» для подписи, а также URL, но это не сработало.

Как использовать заголовок «response-content-disposition», когда должен быть сгенерирован url?

String codedFilename= EncodingUtil.urlEncode(bucketPath,'UTF-8'); 

    String stringtosign = 'GET\n\n\n'+Lexpires+'\n/'+bucketName+'/'+codedFilename; 

    String signed = make_sig(stringtosign); 

    String codedsigned = EncodingUtil.urlEncode(signed,'UTF-8'); 

    String url = serverURL+'/'+bucketName+'/'+codedFilename+'?AWSAccessKeyId='+awskey+'&Expires='+Lexpires+'&Signature='+codedsigned; 

Примечание: - Синтаксис Salesforce-apex.

+0

Пользовательские заголовки устанавливаются на сам файл. Эти заголовки будут отправлены клиенту при загрузке файла. Я считаю, что вы можете сделать это только при первом загрузке файла. – datasage

+0

@ datasage, документация S3 не указывает тег «response-content-type» для запроса PUT. Поэтому я думаю, что мы не можем установить этот заголовок во время загрузки (я могу ошибаться в этом) –

ответ

3
String codedFilename= EncodingUtil.urlEncode(bucketPath,'UTF-8'); 

    String stringtosign = 'GET\n\n\n'+Lexpires+'\n/'+bucketName+'/'+codedFilename+'?response-content-disposition=attachment; filename=abc.doc'; 

    String signed = make_sig(stringtosign); 

    String codedsigned = EncodingUtil.urlEncode(signed,'UTF-8'); 

    String url = serverURL+'/'+bucketName+'/'+codedFilename+'?response-content-disposition='+EncodingUtil.urlEncode('attachment; filename=abc.doc','UTF-8')+'&AWSAccessKeyId='+awskey+'&Expires='+Lexpires+'&Signature='+codedsigned; 

Источник: Unable to override content disposition header in s3

Chrome имеет проблему, если тип контента 'приложения/октет-поток' для документа (PDF междунар этот случай). Однако хром в порядке, если тип содержимого «двоичный/октетный поток».

К счастью, S3 по умолчанию Content-Type для загрузки в 'binary/Octet-stream', если nohig установлен во время загрузки.

Мой совет: - Если вам нужны файлы типа «any» для S3, не зная тип содержимого во время загрузки, просто не устанавливайте его или не устанавливайте в «binary/Octet-stream». Таким образом, Chrome покажет предупреждение, но файл будет загружен.

0

Ниже приведен код Ruby, который подписывает URL-адрес S3 и устанавливает настройку ответа-содержимого. Это позволяет заставить Chrome загружать PDF вместо того, чтобы делать его встроенным.

https://gist.github.com/diamondap/9134867

Смежные вопросы