首页 文章

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

提问于
浏览
3

很少行(下面)生成签名的URL,浏览器被重定向到从S3下载文件 .

当内容类型设置为Octet Stream时,我面临众所周知的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语法 .

2 回答

  • 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就会显示警告,但会下载文件 .

  • 0

    这是一些签署S3 url并设置response-content-disposition的Ruby代码 . 这有助于Chrome下载PDF而不是内联呈现 .

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

相关问题