Java Oss管理
1、OssController
import xyz.xpsh.common.api.CommonResult;
import xyz.xpsh.common.model.oss.OssCallbackResult;
import xyz.xpsh.common.model.oss.OssPolicyResult;
import xyz.xpsh.server.service.OssService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
@Slf4j
@Controller
@RequestMapping("/aliyun/oss")
public class OssController {
@Autowired
private OssService ossService;
@RequestMapping(value = "/policy", method = RequestMethod.GET)
@ResponseBody
public CommonResult<OssPolicyResult> policy() {
log.info("policy1");
OssPolicyResult result = ossService.policy();
log.info("policy2");
return CommonResult.success(result);
}
@RequestMapping(value = "callback", method = RequestMethod.POST)
@ResponseBody
public CommonResult<OssCallbackResult> callback(HttpServletRequest request) {
log.info("callback1");
OssCallbackResult ossCallbackResult = ossService.callback(request);
log.info("callback2");
return CommonResult.success(ossCallbackResult);
}
}
2、OssService
import xyz.xpsh.common.model.oss.OssCallbackResult;
import xyz.xpsh.common.model.oss.OssPolicyResult;
import javax.servlet.http.HttpServletRequest;
public interface OssService {
OssPolicyResult policy();
OssCallbackResult callback(HttpServletRequest request);
String changeInsidePath(String path);
}
3、OssServiceImpl
import xyz.xpsh.common.model.oss.OssCallbackParam;
import xyz.xpsh.common.model.oss.OssCallbackResult;
import xyz.xpsh.common.model.oss.OssPolicyResult;
import xyz.xpsh.server.service.OssService;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Service
public class OssServiceImpl implements OssService {
private static final Logger LOGGER = LoggerFactory.getLogger(OssServiceImpl.class);
@Value("${aliyun.oss.policy.expire}")
private int ALIYUN_OSS_EXPIRE;
@Value("${aliyun.oss.maxSize}")
private int ALIYUN_OSS_MAX_SIZE;
@Value("${aliyun.oss.callback}")
private String ALIYUN_OSS_CALLBACK;
@Value("${aliyun.oss.bucketName}")
private String ALIYUN_OSS_BUCKET_NAME;
@Value("${aliyun.oss.endpoint}")
private String ALIYUN_OSS_ENDPOINT;
@Value("${aliyun.oss.dir.prefix}")
private String ALIYUN_OSS_DIR_PREFIX;
@Value("${aliyun.oss.endpointInside}")
private String ALIYUN_OSS_ENDPOINT_INSIDE;
@Autowired
private OSSClient ossClient;
@Override
public OssPolicyResult policy() {
OssPolicyResult result = new OssPolicyResult();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String dir = ALIYUN_OSS_DIR_PREFIX + sdf.format(new Date());
long expireEndTime = System.currentTimeMillis() + ALIYUN_OSS_EXPIRE * 1000;
Date expiration = new Date(expireEndTime);
long maxSize = ALIYUN_OSS_MAX_SIZE * 1024 * 1024;
OssCallbackParam callback = new OssCallbackParam();
callback.setCallbackUrl(ALIYUN_OSS_CALLBACK);
callback.setCallbackBody("filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}");
callback.setCallbackBodyType("application/x-www-form-urlencoded");
String action = "https://" + ALIYUN_OSS_BUCKET_NAME + "." + 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 = ossClient.generatePostPolicy(expiration, policyConds);
byte[] binaryData = postPolicy.getBytes("utf-8");
String policy = BinaryUtil.toBase64String(binaryData);
String signature = ossClient.calculatePostSignature(postPolicy);
String callbackData = BinaryUtil.toBase64String(JSONUtil.parse(callback).toString().getBytes("utf-8"));
result.setAccessKeyId(ossClient.getCredentialsProvider().getCredentials().getAccessKeyId());
result.setPolicy(policy);
result.setSignature(signature);
result.setDir(dir);
result.setCallback(callbackData);
result.setHost(action);
result.setRandomFileName(UUID.randomUUID().toString());
} catch (Exception e) {
LOGGER.error("签名生成失败", e);
}
return result;
}
@Override
public OssCallbackResult callback(HttpServletRequest request) {
OssCallbackResult result = new OssCallbackResult();
String filename = request.getParameter("filename");
filename = "http://".concat(ALIYUN_OSS_BUCKET_NAME).concat(".").concat(ALIYUN_OSS_ENDPOINT).concat("/").concat(filename);
result.setFilename(filename);
result.setSize(request.getParameter("size"));
result.setMimeType(request.getParameter("mimeType"));
result.setWidth(request.getParameter("width"));
result.setHeight(request.getParameter("height"));
return result;
}
@Override
public String changeInsidePath(String path) {
if (StrUtil.isBlank(path)) {
return null;
}
return path.replaceAll(ALIYUN_OSS_ENDPOINT, ALIYUN_OSS_ENDPOINT_INSIDE);
}
}
4、OssCallbackParam
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class OssCallbackParam {
private String callbackUrl;
private String callbackBody;
private String callbackBodyType;
}
5、OssCallbackResult
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class OssCallbackResult {
private String filename;
private String size;
private String mimeType;
private String width;
private String height;
}
6、OssPolicyResult
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class OssPolicyResult {
private String accessKeyId;
private String policy;
private String signature;
private String dir;
private String host;
private String callback;
private String randomFileName;
}
7、application.yml
aliyun:
oss:
endpoint: oss-cn-hangzhou.aliyuncs.com
endpointInside: oss-cn-hangzhou-internal.aliyuncs.com
accessKeyId: ***********
accessKeySecret: ***********
bucketName: colacodeapplet
policy:
expire: 300
maxSize: 10
callback: http://localhost:8080/crm/aliyun/oss/callback
dir:
prefix: mall/file/
8、pom.xml
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>