获取阿里云OSS文件下载地址时,设置预览或下载

在阿里云的oss中,我们可以设置 Content-Disposition 来决定文件的是预览还是下载。
Content-Disposition 设置为 attachment 的话,生成的url就是直接下载的。

最近在工作中,遇到前端需要同时支持附件的预览和下载。但是又不可能为这个需求,去上传两个相同的文件,分别将Content-Disposition 设置为 attachmentinline ,在官方文档中,生成下载文件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之前的 ? 换成 & 。
原本生成的格式会是

http://1.1.1.1:9999/bucketName/123/a.pdf%3Fresponse-content-disposition%3Dattachment?Expires=1592402977&OSSAccessKeyId=a&Signature=b

需要替换成

http://1.1.1.1:9999/bucketName/123/a.pdf?response-content-disposition=attachment&Expires=1592402977&OSSAccessKeyId=a&Signature=b

然后就可以愉快的根据设置不同的 disposition 入参("attachment""inline" )来选择性生成预览或者下载的链接了。

 
posted @ 2020-10-21 20:30  King-DA  阅读(11475)  评论(0编辑  收藏  举报