Browse Source

增加ProcessFile进度上传文件时文件名rename策略配置

sdxiaomu 2 years ago
parent
commit
d42f9b134f

+ 44 - 18
src/main/java/com/jfinal/core/Controller.java

@@ -37,9 +37,7 @@ import com.jfinal.render.ContentType;
 import com.jfinal.render.JsonRender;
 import com.jfinal.render.Render;
 import com.jfinal.render.RenderManager;
-import com.jfinal.upload.MultipartRequest;
-import com.jfinal.upload.UploadFile;
-import com.jfinal.upload.UploadProgress;
+import com.jfinal.upload.*;
 import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.FileItemFactory;
 import org.apache.commons.fileupload.ProgressListener;
@@ -1496,11 +1494,33 @@ public abstract class Controller {
 	/**
 	 * 获取带进度上传的UploadFile
 	 * 通过callback拿到上传进度数据
+	 * @param callback
+	 * @return
+	 */
+	protected UploadFile getProgressFile(Consumer<UploadProgress> callback) {
+		return getProgressFile(null,null,callback);
+	}
+
+	/**
+	 * 获取带进度上传的UploadFile
+	 * 通过callback拿到上传进度数据
+	 * @param uploadPath
+	 * @param callback
+	 * @return
+	 */
+	protected UploadFile getProgressFile(String uploadPath,Consumer<UploadProgress> callback) {
+		return getProgressFile(null,uploadPath,callback);
+	}
+
+	/**
+	 * 获取带进度上传的UploadFile
+	 * 通过callback拿到上传进度数据
 	 * @param parameterName
+	 * @param uploadPath
 	 * @param callback
 	 * @return
 	 */
-	protected UploadFile getProgressFile(String parameterName, Consumer<UploadProgress> callback) {
+	protected UploadFile getProgressFile(String parameterName,String uploadPath, Consumer<UploadProgress> callback) {
 		HttpServletRequest request = getRequest();
 		// 检查请求是否包含文件上传
 		if (!ServletFileUpload.isMultipartContent(request)) {
@@ -1523,22 +1543,28 @@ public abstract class Controller {
 		try {
 			List<FileItem> formItems = upload.parseRequest(request);
 			if (formItems != null && !formItems.isEmpty()) {
-				for (FileItem item : formItems) {
-					// 处理普通表单字段
-					if (!item.isFormField() && parameterName.equals(item.getFieldName())) {
-						// 处理上传的文件
-						String fileName = new File(item.getName()).getName();
-						String uploadPath = JFinal.me().getConstants().getBaseUploadPath();
-						String filePath = uploadPath + File.separator + fileName;
-						File storeFile = new File(filePath);
-						// 保存文件到硬盘
-						item.write(storeFile);
-						progressFile = new UploadFile(parameterName, uploadPath, fileName, storeFile.getName(), item.getContentType());
-					}
+				FileItem fileItem = null;
+				if(StrKit.isBlank(parameterName)){
+					fileItem = formItems.stream().filter(item->!item.isFormField()).findFirst().orElse(null);
+				}else{
+					fileItem = formItems.stream().filter(item->(!item.isFormField() && parameterName.equals(item.getFieldName()))).findFirst().orElse(null);
+				}
+				if(fileItem != null){
+					// 处理上传的文件
+					String originFileName = fileItem.getName();
+					String finalUploadPath = JFinal.me().getConstants().getBaseUploadPath() + (StrKit.isBlank(uploadPath) ? "" : (File.separator + uploadPath));
+					String newFileName = ProgressUploadFileConfig.getRenameFunc().call(finalUploadPath,originFileName);
+					String filePath = finalUploadPath + File.separator+ newFileName;
+					File storeFile = new File(filePath);
+					// 保存文件到硬盘
+					fileItem.write(storeFile);
+					progressFile = new UploadFile(parameterName, finalUploadPath, storeFile.getName(),originFileName, fileItem.getContentType());
 				}
+
 			}
-		} catch (Exception ex) {
-			ex.printStackTrace();
+		} catch (Exception e) {
+			e.printStackTrace();
+			return null;
 		}
 		return progressFile;
 	}

+ 81 - 0
src/main/java/com/jfinal/upload/ProgressUploadFileConfig.java

@@ -0,0 +1,81 @@
+package com.jfinal.upload;
+
+import com.jfinal.kit.StrKit;
+
+import java.io.File;
+
+/**
+ * 进度上传文件配置
+ * @author 山东小木
+ */
+public class ProgressUploadFileConfig {
+    /**
+     * 进度上传文件 rename 策略
+     * 给了默认实现
+     */
+    private static ProgressUploadFileRenameFunc renameFunc = new DefaultProgressUploadFileRenameFunc();
+
+    /**
+     * 设置自己的策略
+     * @param func
+     */
+    public static void setRenameFunc(ProgressUploadFileRenameFunc func){
+        renameFunc = func;
+    }
+
+    /**
+     * 设置UUID rename策略
+     */
+    public static void setUUIDRenameFunc(){
+        renameFunc = new UUIDProgressUploadFileRenameFunc();
+    }
+
+    /**
+     * 获取当前策略
+     * @return
+     */
+    public static ProgressUploadFileRenameFunc getRenameFunc(){
+        return renameFunc==null?new DefaultProgressUploadFileRenameFunc():renameFunc;
+    }
+
+    /**
+     * 默认策略实现
+     */
+    static class DefaultProgressUploadFileRenameFunc implements ProgressUploadFileRenameFunc {
+        @Override
+        public String call(String directory,String originFileName) {
+            File file = new File(directory+"/"+originFileName);
+            int count = 1;
+            String newFilename = originFileName;
+            while (file.exists()) {
+                int dotIndex = originFileName.lastIndexOf(".");
+                String extension = "";
+                if (dotIndex != -1) {
+                    extension = originFileName.substring(dotIndex);
+                    newFilename = originFileName.substring(0, dotIndex) + "_" + count + extension;
+                } else {
+                    newFilename = originFileName + "_" + count;
+                }
+                file = new File(directory + newFilename);
+                count++;
+            }
+            return newFilename;
+        }
+    }
+
+
+    /**
+     * UUID 内置实现
+     */
+    static class UUIDProgressUploadFileRenameFunc implements ProgressUploadFileRenameFunc {
+        @Override
+        public String call(String directory,String originFileName) {
+            int dotIndex = originFileName.lastIndexOf(".");
+            String extension = "";
+            if (dotIndex != -1) {
+                extension = originFileName.substring(dotIndex);
+            }
+            return StrKit.getRandomUUID()+extension;
+        }
+    }
+}

+ 15 - 0
src/main/java/com/jfinal/upload/ProgressUploadFileRenameFunc.java

@@ -0,0 +1,15 @@
+package com.jfinal.upload;
+
+/**
+ * 进度上传文件 rename 策略func
+ * @author 山东小木
+ */
+public interface ProgressUploadFileRenameFunc {
+    /**
+     * 处理rename
+     * @param directory        文件存放路径
+     * @param originFileName   原文件名
+     * @return                 返回新文件名
+     */
+    public String call(String directory,String originFileName);
+}