获取阿里云OSS文件下载地址时,设置预览或下载
在阿里云的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” )来选择性生成预览或者下载的链接了。