在阿里云的oss中,我们可以设置 Content-Disposition 来决定文件的是预览还是下载。
Content-Disposition 设置为 attachment 的话,生成的url就是直接下载的。
最近在工作中,遇到前端需要同时支持附件的预览和下载。但是又不可能为这个需求,去上传两个相同的文件,分别将Content-Disposition 设置为 attachment 及 inline ,在官方文档中,生成下载文件url时,也没看到有什么入参能够区分这两种情况。
其实,我们通过设置response-content-disposition 的方式,就可以达到这个目的。
//上略
Date expiration = new Date(new Date().getTime() + 1800 * 1000);
GeneratePresignedUrlRequest generatePresignedUrlRequest;
String attachment = "?response-content-disposition=" + disposition;
String attachmentEncoder = encoder(attachment);
key = key + attachment;
generatePresignedUrlRequest = new GeneratePresignedUrlRequest(ossProperties.getBucketName(), key);
generatePresignedUrlRequest.setExpiration(expiration);
url = client.generatePresignedUrl(generatePresignedUrlRequest).toString().replace(attachmentEncoder + "?", attachment + "&");
// 下略
private String encoder(String s) throws UnsupportedEncodingException {
String encoder = URLEncoder.encode(s, "UTF-8");
encoder = encoder.replaceAll("\\+", "%20");
encoder = encoder.replaceAll("\\*", "%2A");
return encoder;
}
把response-content-disposition放到文件的key中一起去签名。
最后要做一次替换是因为要把自动生成的,Expires之前的 ? 换成 & 。
原本生成的格式会是
需要替换成
然后就可以愉快的根据设置不同的 disposition 入参("attachment" 及 "inline" )来选择性生成预览或者下载的链接了。
网友评论