home před 2 roky
rodič
revize
ca34cb240f

+ 0 - 1
hx-service/iot-production/src/main/java/com/fjhx/service/amqp/impl/AmqpDataServiceImpl.java

@@ -48,7 +48,6 @@ public class AmqpDataServiceImpl extends ServiceImpl<AmqpDataMapper, AmqpData> i
     private void saveData(String body) {
         JSONObject jsonObject = JSONObject.parseObject(body);
 
-
         JSONObject bodyObj = jsonObject
                 .getJSONObject("notify_data")
                 .getJSONObject("body");

+ 4 - 0
hx-service/storage/pom.xml

@@ -31,6 +31,10 @@
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-tenant</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 31 - 0
hx-service/storage/src/main/java/com/fjhx/applet/controller/FileController.java

@@ -0,0 +1,31 @@
+package com.fjhx.applet.controller;
+
+import com.fjhx.applet.utils.OssUtil;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+/**
+ * 文件上传
+ */
+@RestController
+@RequestMapping("/applet")
+public class FileController {
+
+    @PostMapping("/uploadFile")
+    public R uploadFile(@RequestParam("file") MultipartFile file) {
+        String path = OssUtil.getFileKey("web", file.getOriginalFilename());
+        try {
+            OssUtil.uploadFile(path, file.getInputStream());
+        } catch (IOException e) {
+            return R.fail("文件上传失败");
+        }
+        return R.success(OssUtil.getFilePath(path));
+    }
+
+}

+ 139 - 0
hx-service/storage/src/main/java/com/fjhx/applet/utils/OssUtil.java

@@ -0,0 +1,139 @@
+package com.fjhx.applet.utils;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.IdUtil;
+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 org.springblade.core.log.exception.ServiceException;
+import sun.misc.BASE64Decoder;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+public class OssUtil {
+
+    public static final String endpoint = "oss-cn-hangzhou.aliyuncs.com";
+
+    public static final String accessKeyId = "LTAI4G5JQxLKhvc53izDwT4x";
+
+    public static final String secretAccessKey = "oQBndIWAzxsNbM96zFkkFZZAAtuy1c";
+
+    public static final String bucketName = "fzjx";
+
+    private OssUtil() {
+    }
+
+    private static OSS getOssClient() {
+        return new OSSClientBuilder().build(endpoint, accessKeyId, secretAccessKey);
+    }
+
+    /**
+     * Base64字符串上传文件
+     */
+    public static void uploadFile(String key, String base64) {
+        ByteArrayInputStream stream;
+
+        try {
+            BASE64Decoder decoder = new BASE64Decoder();
+            byte[] bytes = decoder.decodeBuffer(base64);
+            stream = new ByteArrayInputStream(bytes);
+        } catch (IOException e) {
+            throw new ServiceException("base64错误");
+        }
+        OSS ossClient = getOssClient();
+        ossClient.putObject(bucketName, key, stream);
+        ossClient.shutdown();
+    }
+
+
+    /**
+     * inputStream上传文件
+     */
+    public static void uploadFile(String key, InputStream inputStream) {
+        OSS ossClient = getOssClient();
+        ossClient.putObject(bucketName, key, inputStream);
+        ossClient.shutdown();
+    }
+
+    /**
+     * 删除文件夹
+     */
+    public static void deleteFile(String key) {
+        OSS ossClient = getOssClient();
+        ossClient.deleteObject(bucketName, key);
+        ossClient.shutdown();
+    }
+
+    /**
+     * 获取文件key
+     *
+     * @param prefix
+     * @param fileName
+     * @return
+     */
+    public static String getFileKey(String prefix, String fileName) {
+        StringJoiner joiner = new StringJoiner("/");
+        joiner.add(prefix);
+        joiner.add(DateUtil.format(new Date(), "yyyyMM/dd"));
+        joiner.add(IdUtil.fastSimpleUUID() + "." + FileUtil.extName(fileName));
+        return joiner.toString();
+    }
+
+    public static String getFilePath(String fileKey) {
+        return "https://" + bucketName + "." + endpoint + "/" + fileKey;
+    }
+
+    /**
+     * oss前端获取签名直传
+     *
+     * @param prefix   路径前缀
+     * @param fileName 文件名称,带后缀
+     * @return
+     */
+    public static Map<String, Object> getOssSign(String prefix, String fileName) {
+        // 获取oss链接实例
+        OSS ossClient = OssUtil.getOssClient();
+        // 生成文件保存在oss中的存放位置
+        String dir = getFileKey(prefix, fileName);
+
+        HashMap<String, Object> map = new LinkedHashMap<>();
+        // 生成直连签名逻辑
+        try {
+            long expireTime = 60;
+            long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
+            Date expiration = new Date(expireEndTime);
+            PolicyConditions policyConditions = new PolicyConditions();
+            // PostObject请求最大可支持的文件大小为5 GB,在此设置最大上次文件大小为1000M
+            policyConditions.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
+            // MatchMode.Exact:精确匹配    MatchMode.StartWith:前缀匹配
+            policyConditions.addConditionItem(MatchMode.Exact, PolicyConditions.COND_KEY, dir);
+
+            String postPolicy = ossClient.generatePostPolicy(expiration, policyConditions);
+            byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
+            String encodedPolicy = BinaryUtil.toBase64String(binaryData);
+            String postSignature = ossClient.calculatePostSignature(postPolicy);
+
+            // 记录签名信息
+            map.put("accessId", accessKeyId);
+            map.put("policy", encodedPolicy);
+            map.put("signature", postSignature);
+            map.put("dir", dir);
+            map.put("host", getFilePath(""));
+            map.put("fileUrl", getFilePath(dir));
+
+        } catch (Exception e) {
+            throw new ServiceException("获取oss前端直传签名失败");
+        } finally {
+            ossClient.shutdown();
+        }
+
+        return map;
+    }
+}