思路就是
用户发送上传Policy请求到应用服务器。
应用服务器返回上传Policy和签名给用户。
用户直接上传数据到OSS。
这样上传图片的时候不用发文件流传输到后台 然后后台进行处理 减轻了后台压力。
1.引入jar包
<!-- 阿里云OSS -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.5.0</version>
</dependency>
2. 控制层
import com.xiepanpan.gmall.admin.oms.component.OssCompent;
import com.xiepanpan.gmall.to.CommonResult;
import com.xiepanpan.gmall.to.OssPolicyResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
/**
* Oss相关操作接口
*
*
*/
//@CrossOrigin(origins = "www.baidu.com")
@CrossOrigin
@Controller
@Api(tags = "OssController",description = "Oss管理")
@RequestMapping("/aliyun/oss")
public class OssController {
@Autowired
private OssCompent ossComponent;
@ApiOperation(value = "oss上传签名生成")
@GetMapping(value = "/policy")
@ResponseBody
public Object policy() {
OssPolicyResult policy = ossComponent.policy();
return new CommonResult().success(policy);
}
}
3.
package com.xiepanpan.gmall.admin.oms.component;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.internal.OSSUtils;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.PolicyConditions;
import com.xiepanpan.gmall.to.OssPolicyResult;
import lombok.extern.slf4j.Slf4j;
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.context.annotation.Bean;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by atguigu 5/17.
*/
@Slf4j
@Service
public class OssCompent {
@Value("${aliyun.oss.policy.expire}")
private int ALIYUN_OSS_EXPIRE;
@Value("${aliyun.oss.maxSize}")
private int ALIYUN_OSS_MAX_SIZE;
@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.accessKeyId}")
private String ALIYUN_OSS_KEY;
@Value("${aliyun.oss.accessKeySecret}")
private String ALIYUN_OSS_SECRET_KEY;
@Autowired
private OSSClient ossClient;
/**
* 签名生成
*/
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;
// 提交节点
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);
// 返回结果
result.setAccessKeyId(ossClient.getCredentialsProvider().getCredentials().getAccessKeyId());
result.setPolicy(policy);
result.setSignature(signature);
result.setDir(dir);
result.setHost(action);
} catch (Exception e) {
log.error("签名生成失败", e);
}
return result;
}
@Bean
public OSSClient ossClient(){
//public OSSClient(String endpoint, String accessKeyId, String secretAccessKey)
OSSClient ossClient = new OSSClient(ALIYUN_OSS_ENDPOINT, ALIYUN_OSS_KEY, ALIYUN_OSS_SECRET_KEY);
return ossClient;
}
}
官方文档:
https://help.aliyun.com/document_detail/31926.html?spm=a2c6h.13066369.0.0.3e7f61ccZixXt8
来源:CSDN
作者:周杰伦本人
链接:https://blog.csdn.net/sdaujsj1/article/details/103770088