|
@@ -0,0 +1,76 @@
|
|
|
|
|
+package com.chuanghai.ihotel.controller;
|
|
|
|
|
+
|
|
|
|
|
+import com.aliyun.oss.OSS;
|
|
|
|
|
+import com.aliyun.oss.OSSClientBuilder;
|
|
|
|
|
+import com.aliyun.oss.common.utils.BinaryUtil;
|
|
|
|
|
+import com.aliyun.oss.model.MatchMode;
|
|
|
|
|
+import com.aliyun.oss.model.PolicyConditions;
|
|
|
|
|
+import com.chuanghai.ihotel.common.exception.BizCodeEnume;
|
|
|
|
|
+import com.chuanghai.ihotel.common.exception.RRException;
|
|
|
|
|
+import com.chuanghai.ihotel.common.utils.CommonResult;
|
|
|
|
|
+import com.chuanghai.ihotel.vo.AliyunOssPolicyVO;
|
|
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
|
|
+import org.springframework.web.bind.annotation.GetMapping;
|
|
|
|
|
+import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
|
|
+import org.springframework.web.bind.annotation.RestController;
|
|
|
|
|
+
|
|
|
|
|
+import java.time.LocalDate;
|
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
|
|
+import java.time.ZoneOffset;
|
|
|
|
|
+import java.util.Date;
|
|
|
|
|
+
|
|
|
|
|
+@RestController
|
|
|
|
|
+@RequestMapping("oss")
|
|
|
|
|
+public class OssController {
|
|
|
|
|
+
|
|
|
|
|
+ @Value("${aliyun.oss.endpoint}")
|
|
|
|
|
+ private String endpoint;
|
|
|
|
|
+ @Value("${aliyun.oss.bucket}")
|
|
|
|
|
+ private String bucket;
|
|
|
|
|
+ @Value("${aliyun.oss.access-key}")
|
|
|
|
|
+ private String accessKey;
|
|
|
|
|
+ @Value("${aliyun.oss.secret-key}")
|
|
|
|
|
+ private String accessKeySecret;
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取上传文件签名
|
|
|
|
|
+ * @apiNote 用于文件上传时获取上传文件签名,采用服务器签名后直传的方式进行文件上传,
|
|
|
|
|
+ * 具体文档参考:https://help.aliyun.com/document_detail/31926.html
|
|
|
|
|
+ */
|
|
|
|
|
+ @GetMapping("/aliyun/policy")
|
|
|
|
|
+ public CommonResult<AliyunOssPolicyVO> policy() {
|
|
|
|
|
+ String host = "https://" + bucket + "." + endpoint;
|
|
|
|
|
+ String dir = LocalDate.now().toString() + "/"; // 用户上传文件时指定的前缀。
|
|
|
|
|
+
|
|
|
|
|
+ // oss 客户端
|
|
|
|
|
+ OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, accessKeySecret);
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 过期时间
|
|
|
|
|
+ LocalDateTime expireEndTime = LocalDateTime.now().plusMinutes(30);
|
|
|
|
|
+
|
|
|
|
|
+ PolicyConditions policyConds = new PolicyConditions();
|
|
|
|
|
+ policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
|
|
|
|
|
+ policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
|
|
|
|
|
+
|
|
|
|
|
+ String postPolicy = ossClient.generatePostPolicy(Date.from(expireEndTime.toInstant(ZoneOffset.of("+8"))), policyConds);
|
|
|
|
|
+ byte[] binaryData = postPolicy.getBytes("utf-8");
|
|
|
|
|
+ String encodedPolicy = BinaryUtil.toBase64String(binaryData);
|
|
|
|
|
+ String postSignature = ossClient.calculatePostSignature(postPolicy);
|
|
|
|
|
+
|
|
|
|
|
+ AliyunOssPolicyVO aliyunOssPolicyVO = AliyunOssPolicyVO.builder()
|
|
|
|
|
+ .accessId(accessKey)
|
|
|
|
|
+ .policy(encodedPolicy)
|
|
|
|
|
+ .signature(postSignature)
|
|
|
|
|
+ .dir(dir)
|
|
|
|
|
+ .host(host)
|
|
|
|
|
+ .expire(String.valueOf(expireEndTime.toEpochSecond(ZoneOffset.of("+8"))))
|
|
|
|
|
+ .build();
|
|
|
|
|
+
|
|
|
|
|
+ return CommonResult.ok().setResult(aliyunOssPolicyVO);
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ throw new RRException(BizCodeEnume.FILE_UPLOAD_ERROR, e.getMessage());
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ ossClient.shutdown();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|