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

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

作者: 祭流魂 | 来源:发表于2020-06-17 23:47 被阅读0次

    在阿里云的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" )来选择性生成预览或者下载的链接了。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/ztnexktx.html