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