oss 上传文件 通过post policy

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.

猜你喜欢

转载自blog.csdn.net/weixin_33871366/article/details/87625445