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