AWS S3: принудительная загрузка файлов с использованием 'response-content-disposition'

Несколько строк (ниже) генерируют подписанный URL-адрес, на который браузер перенаправляется для загрузки файла с S3.

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

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

Я попытался добавить '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.

4 ответа

Решение
    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;

Источник: невозможно переопределить заголовок размещения содержимого в s3

Chrome имеет проблему, если для документа используется тип содержимого "application/octet-stream" (pdf int this case). Однако chrome в порядке, если тип содержимого - "двоичный / октетный поток".

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

Мой совет:- Если нужно, чтобы файлы "любого" типа были на S3, не зная типа контента во время загрузки, просто не устанавливайте его или устанавливайте в "двоичный / октетный поток". Таким образом, Chrome покажет предупреждение, но файл загружен.

Используйте мое решение, чтобы установить Content-Disposition для всех объектов S3: GitHub

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

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

Я создал решение для этого с помощью функций CloudFront, что является довольно новым способом работы (по состоянию на август 2022 года). Я задокументировал свою функцию и то, как я настроил свою «корзину S3 за дистрибутивом CloudFront» здесь: /questions/606426/prinuditelnaya-zagruzka-mp3-v-chrome-firefox-safari-i-ie-s-pomoschyu-amazon-s3/63074305#63074305

Другие вопросы по тегам