0. 导入依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.5.0</version>
<scope>compile</scope>
</dependency>
1. application.yml 文件配置
aliyun:
oss:
endpoint: oss-cn-beijing.aliyuncs.com
accessKeyId: xxx
accessKeySecret: xxx
bucketName: gulimall-wensongsong
policy:
expire: 300
maxSize: 10
callback: http://127.0.0.1:88/pms/oss/callback
dir:
prefix: gulimall/images/
2. OssConfig 配置类
package com.atguigu.gulimall.pms.config;
import com.aliyun.oss.OSSClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class OssConfig {
@Value("${aliyun.oss.endpoint}")
private String ALIYUN_OSS_ENDPOINT;
@Value("${aliyun.oss.accessKeyId}")
private String ALIYUN_OSS_ACCESSKEYID;
@Value("${aliyun.oss.accessKeySecret}")
private String ALIYUN_OSS_ACCESSKEYSECRET;
@Bean
public OSSClient ossClient(){
return new OSSClient(ALIYUN_OSS_ENDPOINT,ALIYUN_OSS_ACCESSKEYID,ALIYUN_OSS_ACCESSKEYSECRET);
}
}
3.OssController
import com.atguigu.gulimall.commons.bean.Resp;
import com.atguigu.gulimall.pms.service.OssService;
import com.atguigu.gulimall.pms.dto.OssCallbackResult;
import com.atguigu.gulimall.pms.dto.OssPolicyResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
@RestController
@Api(tags = "OssController",description = "Oss管理")
@RequestMapping("/pms/oss")
public class OssController {
@Autowired
private OssService ossService;
@ApiOperation(value = "oss上传签名生成")
@RequestMapping(value = "/policy", method = RequestMethod.GET)
@ResponseBody
public Resp<OssPolicyResult> policy() {
OssPolicyResult result = ossService.policy();
return Resp.ok(result);
}
@ApiOperation(value = "oss上传成功回调")
@RequestMapping(value = "/callback", method = RequestMethod.POST)
@ResponseBody
public Resp<OssCallbackResult> callback(HttpServletRequest request) {
OssCallbackResult ossCallbackResult = ossService.callback(request);
return Resp.ok(ossCallbackResult);
}
}
4. OssService
import com.atguigu.gulimall.pms.dto.OssCallbackResult;
import com.atguigu.gulimall.pms.dto.OssPolicyResult;
import javax.servlet.http.HttpServletRequest;
public interface OssService {
OssPolicyResult policy();
OssCallbackResult callback(HttpServletRequest request);
}
5. OssServiceImpl
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 com.atguigu.gulimall.pms.service.OssService;
import com.atguigu.gulimall.pms.dto.OssCallbackParam;
import com.atguigu.gulimall.pms.dto.OssCallbackResult;
import com.atguigu.gulimall.pms.dto.OssPolicyResult;
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;
@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;
@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 = "http://" + 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);
} catch (Exception e) {
logger.error("签名生成失败", e);
}
return result;
}
@Override
public OssCallbackResult callback(HttpServletRequest request) {
OssCallbackResult ossCallbackResult = new OssCallbackResult();
String filename = request.getParameter("filename");
filename = "http://".concat(ALIYUN_OSS_BUCKET_NAME).concat(".").concat(ALIYUN_OSS_ENDPOINT).concat("/").concat(filename);
ossCallbackResult.setFilename(filename)
.setSize(request.getParameter("size"))
.setMimeType(request.getParameter("mimeType"))
.setWidth(request.getParameter("width"))
.setHeight(request.getParameter("height"));
return ossCallbackResult;
}
}
喜欢的记得关注,还要点赞哦!!!