浏览代码

阿里云文件上传直传业务开发

wangzhengliang 3 年之前
父节点
当前提交
e7bf6c0cf9

+ 7 - 0
pom.xml

@@ -73,6 +73,13 @@
             <version>5.4.2</version>
             <version>5.4.2</version>
         </dependency>
         </dependency>
 
 
+        <!-- aliyun oss -->
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.10.2</version>
+        </dependency>
+
         <dependency>
         <dependency>
             <groupId>mysql</groupId>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <artifactId>mysql-connector-java</artifactId>

+ 76 - 0
src/main/java/com/chuanghai/ihotel/controller/OssController.java

@@ -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();
+        }
+    }
+}

+ 40 - 0
src/main/java/com/chuanghai/ihotel/vo/AliyunOssPolicyVO.java

@@ -0,0 +1,40 @@
+package com.chuanghai.ihotel.vo;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @Author: codingliang
+ * @Description: 阿里云oss上传凭证vo
+ * @Date: 2022-07-27 11:13
+ * @Version: V1.0
+ **/
+@Data
+@Builder
+public class AliyunOssPolicyVO {
+
+    /**
+     * AccessKey ID
+     */
+    private String accessId;
+    /**
+     * 用户表单上传的策略(Policy)
+     */
+    private String policy;
+    /**
+     * Policy签名后的字符串
+     */
+    private String signature;
+    /**
+     * 文件前缀
+     */
+    private String dir;
+    /**
+     * 上传请求的域名
+     */
+    private String host;
+    /**
+     * Policy过期时间
+     */
+    private String expire;
+}

+ 7 - 0
src/main/resources/application.yml

@@ -33,3 +33,10 @@ logging:
   level:
   level:
     com.chuanghai: debug
     com.chuanghai: debug
 
 
+aliyun:
+  oss:
+    endpoint: oss-cn-hangzhou.aliyuncs.com
+    bucket: ch-ihotel
+    access-key: LTAI5tNSisG8sUJppiMKq2Po
+    secret-key: bLAQ2325jIEIm2NOQC0UWFit2QUhUS
+