几行(下方)生成签名的URL,浏览器被重定向到从S3下载文件。
当内容类型设置为Octet Stream时,我面临众所周知的Chrome不从S3下载pdf文件的问题。
解决方案是强制chrome下载文件而不是尝试读取/打开它。
我尝试添加'response-content-disposition'来签名和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语法。
答案 0 :(得分: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
如果内容类型为文档的“application / octet-stream”,则Chrome存在问题(本例为pdf)。但是,如果内容类型是'binary / octet-stream',那么chrome就可以了。
值得庆幸的是,如果在上传时设置了nothig,则S3默认将Content-Type下载为'binary / Octet-stream'。
我的建议: - 如果在上传时不知道内容类型需要S3的“任何”类型的文件,则不要设置它或将其设置为“binary / Octet-stream”。这样,Chrome就会显示警告,但会下载文件。
答案 1 :(得分:0)
这是一些签署S3 url并设置response-content-disposition的Ruby代码。这有助于Chrome下载PDF而不是内联呈现。
答案 2 :(得分:0)
使用我的解决方案在所有S3对象上设置Content-Disposition:GitHub