From b844453877db2b534106383497fc55fbdfc6a427 Mon Sep 17 00:00:00 2001
From: zqy <2522236926@qq.com>
Date: 星期二, 25 三月 2025 21:12:13 +0800
Subject: [PATCH] 对象存储的上传下载删除接口

---
 ruoyi-admin/pom.xml                                                         |   17 +++
 zhang-content/src/main/java/com/ruoyi/service/impl/GetOrPut.java            |  146 +++++++++++++++++++++++++++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/zhang/CosController.java |   91 ++++++++++++++++++
 ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java    |    9 +
 zhang-content/pom.xml                                                       |   28 +++++
 ruoyi-admin/src/main/resources/application.yml                              |    8 +
 ruoyi-common/pom.xml                                                        |    1 
 7 files changed, 300 insertions(+), 0 deletions(-)

diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 408c1a6..0c8e112 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -77,6 +77,23 @@
             <artifactId>ruoyi-common</artifactId>
         </dependency>
 
+        <!-- 鑵捐浜� -->
+        <dependency>
+            <groupId>com.qcloud</groupId>
+            <artifactId>cos_api</artifactId>
+            <version>5.6.227</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>ch.qos.logback</groupId>
+                    <artifactId>logback-classic</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/zhang/CosController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/zhang/CosController.java
new file mode 100644
index 0000000..896b427
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/zhang/CosController.java
@@ -0,0 +1,91 @@
+package com.ruoyi.web.controller.zhang;
+
+import com.qcloud.cos.utils.IOUtils;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.service.impl.GetOrPut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import javax.servlet.http.HttpServletResponse;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+
+@RestController
+@RequestMapping("/cos")
+public class CosController {
+
+    @Autowired
+    private GetOrPut getOrPut;
+
+    // 鏂囦欢涓婁紶
+    @PostMapping("/upload")
+    public AjaxResult upload(@RequestParam("file") MultipartFile file) {
+        String key;
+        try {
+           key =  getOrPut.uploadFile(file);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        System.out.println("dfsdgd");
+        HashMap<String,String> map = new HashMap<>();
+        map.put("key",key);
+        return AjaxResult.success(map);
+    }
+
+    // 鏂囦欢涓嬭浇
+    @GetMapping("/download")
+    public void download(@RequestParam String key, HttpServletResponse response) {
+        try (InputStream inputStream = getOrPut.getFileStream(key)) {
+
+            String fileExtension = getFileExtension(key);
+            String contentType = getContentType(fileExtension);
+
+            response.setContentType(contentType);
+
+            response.setHeader("Content-Disposition", "attachment; filename=\"" + key + "\"");
+            IOUtils.copy(inputStream, response.getOutputStream());
+        } catch (IOException e) {
+            throw new RuntimeException("鏂囦欢涓嬭浇澶辫触", e);
+        }
+    }
+
+
+    private String getFileExtension(String key) {
+        int dotIndex = key.lastIndexOf('.');
+        if (dotIndex == -1) {
+            return "";  // 娌℃湁鎵╁睍鍚�
+        }
+        return key.substring(dotIndex + 1).toLowerCase();
+    }
+
+    private String getContentType(String fileExtension) {
+        switch (fileExtension) {
+            case "jpg":
+            case "jpeg":
+                return "image/jpeg";
+            case "png":
+                return "image/png";
+            case "gif":
+                return "image/gif";
+            case "pdf":
+                return "application/pdf";
+            case "txt":
+                return "text/plain";
+            default:
+                return "application/octet-stream";  // 榛樿绫诲瀷
+        }
+    }
+
+    @DeleteMapping("/delete")
+    public AjaxResult delete(@RequestParam String key){
+        try {
+            getOrPut.deleteFile(key);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        return AjaxResult.success("鏂囦欢涓婁紶鎴愬姛");
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 4aece0c..6032dc1 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -144,3 +144,11 @@
   # 鍖归厤閾炬帴
   urlPatterns: /system/*,/monitor/*,/tool/*
 
+#鑵捐浜�
+tencent:
+  cos:
+    secret-id: AKIDOelfP1QbZJq9E5j9LI2YptwlNlvsbBf0       # 鏇挎崲涓哄疄闄匰ecretId
+    secret-key: DCxVpvnRt89wVs2ygATYZWOMFzXtAHB3    # 鏇挎崲涓哄疄闄匰ecretKey
+    bucket-name: examplebucket-22222-1346631008  # 瀛樺偍妗跺悕绉�
+    region: ap-guangzhou            # 瀛樺偍妗跺湴鍩�
+    base-url: https://examplebucket-22222-1346631008.cos.ap-guangzhou.myqcloud.com # 璁块棶鍩虹URL
\ No newline at end of file
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 15eb4c0..67e2fe8 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -181,6 +181,7 @@
         </dependency>
 
 
+
     </dependencies>
 
     <build>
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java
index a1bcfe2..787da47 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java
@@ -34,6 +34,15 @@
         {
             requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response);
         }
+
+        else if (request instanceof HttpServletRequest
+                && StringUtils.startsWithIgnoreCase(request.getContentType(), "image/"))
+        {
+            // 瀵逛簬鍥剧墖璇锋眰锛屼笉鍋氫换浣曞寘瑁�
+            chain.doFilter(request, response);
+            return;  // 鐩存帴杩斿洖锛岄伩鍏嶅悗缁殑浠g爜鎵ц
+        }
+
         if (null == requestWrapper)
         {
             chain.doFilter(request, response);
diff --git a/zhang-content/pom.xml b/zhang-content/pom.xml
index 5fc59a4..c94faf8 100644
--- a/zhang-content/pom.xml
+++ b/zhang-content/pom.xml
@@ -73,6 +73,34 @@
             <artifactId>spring-test</artifactId>
         </dependency>
 
+        <!-- 鑵捐浜� -->
+        <dependency>
+            <groupId>com.qcloud</groupId>
+            <artifactId>cos_api</artifactId>
+            <version>5.6.227</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>ch.qos.logback</groupId>
+                    <artifactId>logback-classic</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.yaml</groupId>
+            <artifactId>snakeyaml</artifactId>
+            <version>2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.8</version>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/zhang-content/src/main/java/com/ruoyi/service/impl/GetOrPut.java b/zhang-content/src/main/java/com/ruoyi/service/impl/GetOrPut.java
new file mode 100644
index 0000000..f23b112
--- /dev/null
+++ b/zhang-content/src/main/java/com/ruoyi/service/impl/GetOrPut.java
@@ -0,0 +1,146 @@
+package com.ruoyi.service.impl;
+
+import com.qcloud.cos.COSClient;
+import com.qcloud.cos.ClientConfig;
+import com.qcloud.cos.auth.BasicCOSCredentials;
+import com.qcloud.cos.auth.COSCredentials;
+import com.qcloud.cos.http.HttpProtocol;
+import com.qcloud.cos.model.*;
+import com.qcloud.cos.region.Region;
+import com.qcloud.cos.transfer.TransferManager;
+import com.qcloud.cos.transfer.TransferManagerConfiguration;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.PostConstruct;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.UUID;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@Service
+@ConfigurationProperties(prefix = "tencent.cos")
+public class GetOrPut {
+    // 浠庨厤缃枃浠惰鍙栫殑鍙傛暟
+    private String secretId;
+    private String secretKey;
+    private String bucketName;
+    private String region;
+    private String baseUrl;
+
+    private COSClient cosClient;
+    private TransferManager transferManager;
+
+    // 鍒濆鍖栭厤缃�
+    @PostConstruct
+    private void init() {
+        // 1. 鍒濆鍖栫敤鎴疯韩浠戒俊鎭�
+        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
+
+        // 2. 璁剧疆bucket鐨勫尯鍩�
+        Region region = new Region(this.region);
+        ClientConfig clientConfig = new ClientConfig(region);
+        clientConfig.setHttpProtocol(HttpProtocol.https);
+
+        // 3. 鐢熸垚cos瀹㈡埛绔�
+        cosClient = new COSClient(cred, clientConfig);
+
+        // 4. 鍒濆鍖栦紶杈撶鐞嗗櫒锛堢敤浜庡ぇ鏂囦欢涓婁紶锛�
+        ExecutorService threadPool = Executors.newFixedThreadPool(32);
+        TransferManagerConfiguration transferConfig = new TransferManagerConfiguration();
+        transferConfig.setMultipartUploadThreshold(5 * 1024 * 1024);
+        transferManager = new TransferManager(cosClient, threadPool);
+        transferManager.setConfiguration(transferConfig);
+    }
+
+    /**
+     * 涓婁紶鏂囦欢锛圡ultipartFile鏂瑰紡锛�
+     * @param file 涓婁紶鐨勬枃浠�
+     * @return 鏂囦欢璁块棶URL
+     */
+    public String uploadFile(MultipartFile file) {
+        try {
+            // 鐢熸垚鍞竴鏂囦欢鍚�
+            String originalFilename = file.getOriginalFilename();
+            String fileExt = originalFilename.substring(originalFilename.lastIndexOf("."));
+            String key = java.util.UUID.randomUUID().toString() + fileExt;
+
+            ObjectMetadata metadata = new ObjectMetadata();
+            metadata.setContentLength(file.getSize());
+            metadata.setContentType(file.getContentType());
+
+            PutObjectRequest putObjectRequest = new PutObjectRequest(
+                    bucketName,
+                    key,
+                    file.getInputStream(),
+                    metadata
+            );
+
+            // 涓婁紶鏂囦欢
+            PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
+            return baseUrl + "/" + key;
+        } catch (IOException e) {
+            throw new RuntimeException("鏂囦欢涓婁紶澶辫触", e);
+        }
+    }
+
+    /**
+     * 涓婁紶鏈湴鏂囦欢
+     * @param localFilePath 鏈湴鏂囦欢璺緞
+     * @return 鏂囦欢璁块棶URL
+     */
+    public String uploadLocalFile(String localFilePath) {
+        File localFile = new File(localFilePath);
+        String key = UUID.randomUUID().toString() + getFileExtension(localFile.getName());
+
+        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
+        cosClient.putObject(putObjectRequest);
+        return baseUrl + "/" + key;
+    }
+
+    /**
+     * 涓嬭浇鏂囦欢鍒版湰鍦�
+     * @param key 鏂囦欢鍞竴鏍囪瘑
+     * @param localFilePath 鏈湴瀛樺偍璺緞
+     */
+    public void downloadFile(String key, String localFilePath) {
+        File downFile = new File(localFilePath);
+        GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
+        cosClient.getObject(getObjectRequest, downFile);
+    }
+
+    /**
+     * 鑾峰彇鏂囦欢杈撳叆娴�
+     * @param key 鏂囦欢鍞竴鏍囪瘑
+     * @return 鏂囦欢杈撳叆娴�
+     */
+    public InputStream getFileStream(String key) {
+        COSObject cosObject = cosClient.getObject(bucketName, key);
+        return cosObject.getObjectContent();
+    }
+
+    /**
+     * 鍒犻櫎鏂囦欢
+     * @param key 鏂囦欢鍞竴鏍囪瘑
+     */
+    public void deleteFile(String key) {
+        cosClient.deleteObject(bucketName, key);
+    }
+
+    // 鑾峰彇鏂囦欢鎵╁睍鍚�
+    private String getFileExtension(String fileName) {
+        return fileName.substring(fileName.lastIndexOf("."));
+    }
+
+    // Getter/Setter 鐢ㄤ簬閰嶇疆娉ㄥ叆
+    public void setSecretId(String secretId) { this.secretId = secretId; }
+    public void setSecretKey(String secretKey) { this.secretKey = secretKey; }
+    public void setBucketName(String bucketName) { this.bucketName = bucketName; }
+    public void setRegion(String region) { this.region = region; }
+    public void setBaseUrl(String baseUrl) { this.baseUrl = baseUrl; }
+}

--
Gitblit v1.9.1