AWS S3:使用 'response-content-disposition'强制下载文件



几行(如下)生成签名URL,浏览器被重定向到该URL以从S3下载文件。

当内容类型设置为八进制流时,我遇到了众所周知的Chrome无法从S3下载pdf文件的问题。

解决方案是强制 chrome 下载文件而不是尝试读取/打开它。

我尝试在签名和 URL 中添加"响应内容处置",但没有奏效。

生成 url 时如何使用"响应-内容-处置"标头?

    String codedFilename=  EncodingUtil.urlEncode(bucketPath,'UTF-8');
    String stringtosign = 'GETnnn'+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 语法。

    String codedFilename=  EncodingUtil.urlEncode(bucketPath,'UTF-8');
    String stringtosign = 'GETnnn'+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 就会出现问题(在这种情况下是 pdf int)。但是,如果内容类型为"二进制/八位字节流",则 chrome 是可以的。

值得庆幸的是,如果在上传时设置了nothig,则S3默认下载的内容类型为"二进制/八进制流"。

我的建议:-如果需要将"任何"类型的文件发送到 S3,而上传时不知道内容类型,请不要将其设置或设置为"二进制/八进制流"。这样,Chrome 将显示警告,但文件已下载。

下面是一些 Ruby 代码,用于对 S3 URL 进行签名并设置响应内容处置。这可以强制 Chrome 下载 PDF 而不是内联呈现。

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

我创建了一个通过 CloudFront 函数执行此操作的解决方案,这是相当新的做事方式(截至 2022 年 8 月)。我在此处记录了我的函数以及如何设置"CloudFront 分配后面的 S3 存储桶":https://stackoverflow.com/a/73451456/19823883

最新更新