package com.zheng.oss.web.service;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.PolicyConditions;
import com.zheng.common.util.PropertiesFileUtil;
import com.zheng.oss.common.constant.OssConstant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by ZhangShuzheng on 2017/5/15.
*/
@Service
public class AliyunOssService {
private static Logger _log = LoggerFactory.getLogger(AliyunOssService.class);
@Autowired
private OSSClient aliyunOssClient;
/**
* 签名生成
* @return
*/
public JSONObject policy() {
JSONObject result = new JSONObject();
// 存储目录
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String dir = sdf.format(new Date());
// 签名有效期
long expireEndTime = System.currentTimeMillis() + OssConstant.ALIYUN_OSS_EXPIRE * 1000;
Date expiration = new Date(expireEndTime);
// 文件大小
long maxSize = OssConstant.ALIYUN_OSS_MAX_SIZE * 1024 * 1024;
// 回调
JSONObject callback = new JSONObject();
callback.put("callbackUrl", PropertiesFileUtil.getInstance("config").get("aliyun.oss.callback"));
callback.put("callbackBody", "filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}");
callback.put("callbackBodyType", "application/x-www-form-urlencoded");
// 提交节点
String action = "http://" + OssConstant.ALIYUN_OSS_BUCKET_NAME + "." + OssConstant.ALIYUN_OSS_ENDPOINT;
try {
PolicyConditions policyConds = new PolicyConditions();
policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, maxSize);
policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
String postPolicy = aliyunOssClient.generatePostPolicy(expiration, policyConds);
byte[] binaryData = postPolicy.getBytes("utf-8");
String policy = BinaryUtil.toBase64String(binaryData);
String signature = aliyunOssClient.calculatePostSignature(postPolicy);
String callbackData = BinaryUtil.toBase64String(callback.toString().getBytes("utf-8"));
// 返回结果
result.put("OSSAccessKeyId", aliyunOssClient.getCredentialsProvider().getCredentials().getAccessKeyId());
result.put("policy", policy);
result.put("signature", signature);
result.put("dir", dir);
result.put("callback", callbackData);
result.put("action", action);
} catch (Exception e) {
_log.error("签名生成失败", e);
}
return result;
}
}