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;
}
网友评论