美文网首页
oss 上传文件 通过post policy

oss 上传文件 通过post policy

作者: 良人与我 | 来源:发表于2019-01-31 21:29 被阅读3次

    web前端 将文件传递给后端,后端在存储到 oss 的方式比较占用带宽。
    所以想通过web前端直接传递给oss
    如果web端存储了 key 和 security 又不安全。
    所以通过前端请求后端,获取 post policy ,然后通过post policy 上传文档。

    阿里oss sdk

            <dependency>
                <groupId>com.aliyun.oss</groupId>
                <artifactId>aliyun-sdk-oss</artifactId>
                <version>${aliyun-sdk-oss.version}</version>
            </dependency>
    

    获取 post policy

    @Component
    public class PostPolicyUtil {
    
        public static final String VIDEO_DIR_IMG = "video";
    
    
        private static OSSClient client;
    
        private static OssProperties properties;
    
    
        @Autowired
        public void setClient(OSSClient client) {
            PostPolicyUtil.client = client;
        }
    
        @Autowired
        public void setProperties(OssProperties properties) {
            PostPolicyUtil.properties = properties;
        }
    
        /**
         * @desc 获取 post policy
         * @param expireTime 秒
         * @return
         * @throws UnsupportedEncodingException
         */
        public static PostPolicyModel getPostPolicy(long expireTime) throws UnsupportedEncodingException {
    
            long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
            Date expiration = new Date(expireEndTime);
            PolicyConditions policyConds = new PolicyConditions();
            policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
            policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, VIDEO_DIR_IMG);
    
            String postPolicy = client.generatePostPolicy(expiration, policyConds);
            byte[] binaryData = postPolicy.getBytes("utf-8");
            String encodedPolicy = BinaryUtil.toBase64String(binaryData);
            String postSignature = client.calculatePostSignature(postPolicy);
    
            PostPolicyModel postPolicyModel = new PostPolicyModel();
            postPolicyModel.setAccessId(properties.getKeyId());
            postPolicyModel.setPolicy(encodedPolicy);
            postPolicyModel.setSignature(postSignature);
            postPolicyModel.setDir(VIDEO_DIR_IMG);
            String host = StringUtils.join(properties.getUrl().split("//"),"//"+properties.getBucketName()+".");
            postPolicyModel.setHost(host);
            postPolicyModel.setExpire(String.valueOf(expireEndTime / 1000));
            return postPolicyModel;
        }
    
    }
    
    

    返回给前端的 model

    @Getter
    @Setter
    public class PostPolicyModel {
    
        private String policy;
    
        private String signature;
    
        private String dir;
    
        private String expire;
    
        /**
         * 请填写您的AccessKeyId
          */
        private String accessId;
        /**
         * host的格式为 http://bucketname.endpoint
         */
        private String host;
    }
    

    参考文档
    https://help.aliyun.com/document_detail/91868.html?spm=a2c4g.11186623.2.15.7b7c4382QiRhlD#concept-ahk-rfz-2fb.

    相关文章

      网友评论

          本文标题:oss 上传文件 通过post policy

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