From 3b10165395a56f2da479a757e1d751a65079279d Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期二, 18 十月 2022 15:04:11 +0800
Subject: [PATCH] 添加上传大文件功能

---
 src/main/java/com/lf/server/helper/WebHelper.java                   |   47 ++---------
 src/main/java/com/lf/server/controller/data/UploaderController.java |    4 
 src/main/java/com/lf/server/service/data/UploaderService.java       |  140 +++++++++++++++++++---------------
 pom.xml                                                             |    4 
 src/main/resources/application.yml                                  |    6 +
 5 files changed, 100 insertions(+), 101 deletions(-)

diff --git a/pom.xml b/pom.xml
index be47d43..b52f064 100644
--- a/pom.xml
+++ b/pom.xml
@@ -173,12 +173,12 @@
         <dependency>
             <groupId>commons-fileupload</groupId>
             <artifactId>commons-fileupload</artifactId>
-            <version>1.3.1</version>
+            <version>1.4</version>
         </dependency>
         <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
-            <version>2.5</version>
+            <version>2.11.0</version>
         </dependency>
         <!--GDAL-->
         <dependency>
diff --git a/src/main/java/com/lf/server/controller/data/UploaderController.java b/src/main/java/com/lf/server/controller/data/UploaderController.java
index 109ddd8..761e753 100644
--- a/src/main/java/com/lf/server/controller/data/UploaderController.java
+++ b/src/main/java/com/lf/server/controller/data/UploaderController.java
@@ -30,9 +30,9 @@
     @PostMapping({"/uploadData"})
     public ResponseMsg<Object> uploadData(HttpServletRequest req, HttpServletResponse res) {
         try {
-            uploaderService.uploadData(req, res);
+            Object obj = uploaderService.uploadData(req, res);
 
-            return success("");
+            return success(obj);
         } catch (Exception ex) {
             return fail(ex.getMessage(), null);
         }
diff --git a/src/main/java/com/lf/server/helper/WebHelper.java b/src/main/java/com/lf/server/helper/WebHelper.java
index d3d5922..3ab27d1 100644
--- a/src/main/java/com/lf/server/helper/WebHelper.java
+++ b/src/main/java/com/lf/server/helper/WebHelper.java
@@ -5,6 +5,7 @@
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
+import javax.servlet.ServletContext;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -33,9 +34,6 @@
 
     /**
      * 鑾峰彇鐢ㄦ埛ip
-     *
-     * @param request
-     * @return
      */
     public static String getIpAddress(HttpServletRequest request) {
         String ip = request.getHeader("X-Forwarded-For");
@@ -88,9 +86,6 @@
 
     /**
      * 鑾峰彇褰撳墠鏃堕棿鎸囧畾鍒嗛挓鏁板悗鐨凾imestamp
-     *
-     * @param min 鍒嗛挓鏁�
-     * @return
      */
     public static Timestamp getTimestamp(int min) {
         Calendar now = Calendar.getInstance();
@@ -101,9 +96,6 @@
 
     /**
      * 浠嶤ookie涓幏鍙杢oken
-     *
-     * @param request
-     * @return
      */
     public static String getTokenFromCookie(HttpServletRequest request) {
         Cookie[] cookies = request.getCookies();
@@ -125,10 +117,6 @@
 
     /**
      * 鍚慍ookie涓坊鍔爐oken
-     *
-     * @param token
-     * @param request
-     * @param response
      */
     public static void saveToken2Cookie(String token, HttpServletRequest request, HttpServletResponse response) {
         // 鍏堝垹闄�
@@ -140,10 +128,6 @@
 
     /**
      * 淇濆瓨Cookie
-     *
-     * @param key
-     * @param value
-     * @param response
      */
     public static void saveCookie(String key, String value, HttpServletResponse response) {
         Cookie cookie = new Cookie(key, value);
@@ -159,9 +143,6 @@
 
     /**
      * 鍒犻櫎cookie涓殑鍊�
-     *
-     * @param cookieKey
-     * @param request
      */
     public static void deleteCookie(String cookieKey, HttpServletRequest request, HttpServletResponse response) {
         Cookie[] cookies = request.getCookies();
@@ -178,9 +159,6 @@
 
     /**
      * 鍒犻櫎鎵�鏈塁ookie
-     *
-     * @param request
-     * @param response
      */
     public static void deleteCookies(HttpServletRequest request, HttpServletResponse response) {
         Cookie[] cookies = request.getCookies();
@@ -213,9 +191,6 @@
 
     /**
      * 鑾峰彇Token
-     *
-     * @param request
-     * @return
      */
     public static String getToken(HttpServletRequest request) {
         // 1.浠巙rl鍙傛暟涓紝鑾峰彇token
@@ -236,8 +211,6 @@
 
     /**
      * 鑾峰彇Request
-     *
-     * @return
      */
     public static HttpServletRequest getRequest() {
         ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
@@ -247,8 +220,6 @@
 
     /**
      * 鑾峰彇Response
-     *
-     * @return
      */
     public static HttpServletResponse getResponse() {
         ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
@@ -258,19 +229,23 @@
 
     /**
      * 鑾峰彇Session
-     *
-     * @return
      */
     public static HttpSession getSession() {
         return getRequest().getSession();
     }
 
     /**
+     * 鑾峰彇鐪熷疄璺緞
+     */
+    public static String getRealPath(String path) {
+        HttpServletRequest req = getRequest();
+        ServletContext ctx = req.getSession().getServletContext();
+
+        return ctx.getRealPath("/" + path);
+    }
+
+    /**
      * 杈撳嚭json鏁版嵁鍒板墠绔�
-     *
-     * @param response
-     * @param jsonPack
-     * @throws Exception
      */
     public static boolean write2Page(HttpServletResponse response, String jsonPack) throws IOException {
         response.setContentType("application/json;charset=UTF-8");
diff --git a/src/main/java/com/lf/server/service/data/UploaderService.java b/src/main/java/com/lf/server/service/data/UploaderService.java
index c5cb523..cdc0ce2 100644
--- a/src/main/java/com/lf/server/service/data/UploaderService.java
+++ b/src/main/java/com/lf/server/service/data/UploaderService.java
@@ -23,8 +23,8 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
 
-import javax.servlet.ServletContext;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -45,12 +45,6 @@
 
     @Autowired
     AttachService attachService;
-
-    private final static long ONE_DAY = 24 * 60 * 60 * 1000;
-
-    private final static long SIZE_MAX = 1024 * 1024 * 1024 * 1024;
-
-    private final static long FILE_SIZE_MAX = 256 * 1024 * 1024 * 1024;
 
     private final static Log log = LogFactory.getLog(UploaderService.class);
 
@@ -179,41 +173,92 @@
     /**
      * 涓婁紶鏂囦欢
      */
-    public void uploadData(HttpServletRequest req, HttpServletResponse res) {
-        try {
-            // 澶勭悊涓枃涔辩爜闂
-            req.setCharacterEncoding("utf-8");
-            res.setContentType("text/html;charset=utf-8");
+    public Object uploadData(HttpServletRequest request, HttpServletResponse res) throws Exception {
+        StandardMultipartHttpServletRequest req = (StandardMultipartHttpServletRequest) request;
+        req.setCharacterEncoding("utf-8");
+        res.setContentType("application/json;charset=utf-8");
 
-            // 妫�鏌ヨ姹傛槸/鍚︿负multipart/form-data绫诲瀷
-            if (!ServletFileUpload.isMultipartContent(req)) {
-                throw new RuntimeException("琛ㄥ崟鐨別nctype灞炴�т笉鏄痬ultipart/form-data绫诲瀷");
+        Map<String, String> map = getParams(req);
+        List<FileInfo> list = getFiles(req);
+
+        return list.size();
+    }
+
+    private Map<String, String> getParams(StandardMultipartHttpServletRequest req) {
+        Map<String, String> map = new HashMap<String, String>(3);
+
+        Enumeration<String> enumeration = req.getParameterNames();
+        while (enumeration.hasMoreElements()) {
+            String key = enumeration.nextElement();
+            String value = req.getParameter(key);
+            map.put(key, value);
+        }
+
+        return map;
+    }
+
+    private List<FileInfo> getFiles(StandardMultipartHttpServletRequest req) throws Exception {
+        List<FileInfo> list = new ArrayList<FileInfo>();
+
+        String path = pathHelper.getTempPath();
+        Iterator<String> iterator = req.getFileNames();
+        while (iterator.hasNext()) {
+            MultipartFile file = req.getFile(iterator.next());
+
+            FileInfo fi = new FileInfo(file.getOriginalFilename());
+            if (StringHelper.isEmpty(fi.getFileName())) {
+                continue;
             }
 
-            // 鍒涘缓涓婁紶鎵�闇�瑕佺殑涓や釜瀵硅薄锛氱鐩樻枃浠跺璞�+鏂囦欢涓婁紶瀵硅薄
-            DiskFileItemFactory factory = new DiskFileItemFactory();
-            ServletFileUpload sfu = new ServletFileUpload(factory);
-            ServletRequestContext ctx = new ServletRequestContext(req);
+            fi.setSize(file.getSize());
+            fi.setPath(path + File.separator + fi.getFileName());
+            file.transferTo(new File(fi.getPath()));
 
-            // 闄愬埗涓婁紶鐨勬�绘枃浠跺ぇ灏�
-            sfu.setSizeMax(SIZE_MAX);
-            // 闄愬埗鍗曚釜鏂囦欢鐨勫ぇ灏�
-            sfu.setFileSizeMax(FILE_SIZE_MAX);
-            // 璁剧疆缂栫爜鏂瑰紡
-            sfu.setHeaderEncoding("utf-8");
-
-            // list瀹瑰櫒鐢ㄦ潵淇濆瓨琛ㄥ崟涓殑鎵�鏈夋暟鎹俊鎭�
-            List<FileItem> items = sfu.parseRequest(ctx);
-            copeFileItems(items, req);
-        } catch (Exception ex) {
-            log.error(ex.getMessage() + ex.getStackTrace() + "\n");
+            list.add(fi);
         }
+
+        return list;
+    }
+
+    public Object fileUpload(HttpServletRequest req, HttpServletResponse res) throws Exception {
+        List<FileItem> items = getFileItem(req, res);
+
+        return copeFileItems(items, req);
+    }
+
+    /**
+     * 鑾峰彇鏂囦欢椤�
+     */
+    private List<FileItem> getFileItem(HttpServletRequest req, HttpServletResponse res) throws Exception {
+        // 澶勭悊涓枃涔辩爜闂
+        req.setCharacterEncoding("utf-8");
+        // text/html;charset=utf-8
+        res.setContentType("application/json;charset=utf-8");
+
+        // 妫�鏌ヨ姹傛槸/鍚︿负multipart/form-data绫诲瀷
+        if (!ServletFileUpload.isMultipartContent(req)) {
+            throw new RuntimeException("琛ㄥ崟鐨別nctype灞炴�т笉鏄痬ultipart/form-data绫诲瀷");
+        }
+
+        // 鍒涘缓涓婁紶鎵�闇�瑕佺殑涓や釜瀵硅薄锛氱鐩樻枃浠跺璞�+鏂囦欢涓婁紶瀵硅薄
+        DiskFileItemFactory factory = new DiskFileItemFactory();
+        ServletFileUpload sfu = new ServletFileUpload(factory);
+        ServletRequestContext ctx = new ServletRequestContext(req);
+
+        // 璁剧疆缂栫爜鏂瑰紡
+        sfu.setHeaderEncoding("utf-8");
+        factory.setSizeThreshold(4096);
+
+        // 鑾峰彇琛ㄥ崟涓殑鎵�鏈夋暟鎹俊鎭�
+        List<FileItem> list = sfu.parseRequest(ctx);
+
+        return list;
     }
 
     /**
      * 澶勭悊瑙f瀽鍐呭锛氬鐞嗘櫘閫氳〃鍗曞煙鍜屾枃浠惰〃鍗曞煙
      */
-    private void copeFileItems(List<FileItem> items, HttpServletRequest req) throws Exception {
+    private Object copeFileItems(List<FileItem> items, HttpServletRequest req) throws Exception {
         Map<String, String> map = new HashMap<String, String>(3);
         List<FileInfo> list = new ArrayList<FileInfo>();
 
@@ -231,6 +276,8 @@
                 list.add(fi);
             }
         }
+
+        return map;
     }
 
     /**
@@ -252,35 +299,6 @@
         } catch (Exception ex) {
             log.error(ex.getMessage() + ex.getStackTrace() + "\n");
             return null;
-        }
-    }
-
-    private void handleFileField(FileItem item, HttpServletRequest req) {
-        // 鑾峰彇 鏂囦欢鏁版嵁椤逛腑鐨� 鏂囦欢鍚�
-        String fileName = item.getName();
-
-        // 鎺у埗鍙兘涓婁紶鍥剧墖
-        String img = "image";
-        if (!item.getContentType().startsWith(img)) {
-            return;
-        }
-
-        // 鑾峰彇 褰撳墠椤圭洰涓嬬殑 /files 鐩綍鐨勭粷瀵逛綅缃�
-        ServletContext ctx = req.getSession().getServletContext();
-        String path = ctx.getRealPath("/files");
-
-        // 鍒涘缓 file瀵硅薄
-        File file = new File(path);
-        if (!file.exists()) {
-            // 鍒涘缓鐩綍
-            file.mkdir();
-        }
-
-        // 灏嗘枃浠朵繚瀛樺埌鏈嶅姟鍣ㄤ笂锛圲UID鏄�氱敤鍞竴鏍囪瘑鐮侊級
-        try {
-            item.write(new File(file.toString(), UUID.randomUUID() + "_" + fileName));
-        } catch (Exception e) {
-            e.printStackTrace();
         }
     }
 }
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 88659a0..257aa9b 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -24,6 +24,12 @@
   # session
   session:
     timeout: PT20M # 20鍒嗛挓
+  # 璁剧疆涓婁紶鏂囦欢澶у皬
+  servlet:
+    multipart:
+      enabled: true
+      max-file-size: 204800MB
+      max-request-size: 1048576MB
   # jackson
   jackson:
     time-zone: GMT+8

--
Gitblit v1.9.3