7

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

当内容类型设置为八位字节流时​​,我面临着 Chrome 无法从 S3 下载 pdf 文件的众所周知的问题。

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

我尝试添加 'response-content-disposition' 来签名以及 URL,但它不起作用。

生成 url 时如何使用“response-content-disposition”标头?

    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

2 回答 2

5
    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 中的内容处置标头

如果文档的内容类型为“应用程序/八位字节流”(本例为 pdf int),Chrome 会出现问题。但是,如果内容类型是“二进制/八位字节流”,则 chrome 是可以的。

值得庆幸的是,如果在上传时未设置任何内容,S3 默认下载的 Content-Type 为“二进制/八位字节流”。

我的建议:- 如果在上传时不知道内容类型的情况下需要将“任何”类型的文件传输到 S3,请不要设置它或将其设置为“二进制/八位字节流”。这样 Chrome 将显示警告但文件已下载。

于 2013-09-28T07:05:37.987 回答
0

下面是一些 Ruby 代码,它对 S3 url 进行签名并设置 response-content-disposition。这可以强制 Chrome 下载 PDF 而不是内联呈现它。

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

于 2014-02-21T15:27:37.153 回答