1. 程式人生 > >MultipartFile檔案上傳 多檔案上傳 接受js檔案

MultipartFile檔案上傳 多檔案上傳 接受js檔案

本次帶來的是MultipartFile多檔案檔案上傳,可以在sql執行完成,沒有出現異常,再將檔案儲存進我們的伺服器,如果出現異常,檔案不會上傳到我們的伺服器

上傳圖片工具類


import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.math.RandomUtils;
import org.springframework.web.multipart.MultipartFile;

public class FileLoad {
	public static Map load(HttpServletRequest request, HttpServletResponse response, MultipartFile[] file) {
		// map 儲存MultipartFile[]檔案陣列 File類上傳路徑及陣列 上傳路徑及名稱(將其儲存進資料庫)
		Map map = new HashMap();
		// 上傳檔名加路徑
		List<String> listFilePath = new ArrayList<String>();
		// File提供路徑及檔名
		List<File> listFile = new ArrayList<File>();
		// 定義儲存路徑
		String filePath = request.getServletContext().getRealPath("/file");
		System.err.println("上傳路徑是:" + filePath);
		// 設定檔案上傳大小為50MB
		int fileSize = 50000000;
		// 最終要儲存的檔名稱
		String loadfileName = "";
		// 檔案字尾
		String suffix;
		// 判斷檔案陣列是否為空
		if (file != null) {
			// 計算一次檔案累加不餓能超過50MB
			long fs = 0;
			for (int i = 0; i < file.length; i++) {
				fs += file[i].getSize();// 檔案大小累加
			}
			System.out.println(fs);
			// 判斷檔案累加不能超過50MB
			if (fs < fileSize) {
				for (int i = 0; i < file.length; i++) {
					// 判斷是否上傳真檔案 利用上傳檔名字是否等於空字元 可能會出現假檔案
					if (file[i].getOriginalFilename() != "" && file[i].getOriginalFilename() != null) {
						// 獲取使用者上傳檔名
						String oldfileName = file[i].getOriginalFilename();
						// 使用工具類FilenameUtils 擷取原始檔名的字尾
						suffix = FilenameUtils.getExtensionName(oldfileName);
						System.out.println("原檔名:" + oldfileName);
						System.out.println("字尾:" + suffix);
						// 判斷檔名字尾是否等於 gif,jpg,jpeg,bmp,png
						if (suffix.equals("gif") || suffix.equals("jpg") || suffix.equals("jpeg")
								|| suffix.equals("bmp") || suffix.equals("png")) {
							// 生成上傳檔名,當前時間加隨機數
							String fileName = System.currentTimeMillis() + RandomUtils.nextInt(1000000) + "." + suffix;
							// 要上傳的路徑和檔名
							File targetFile = new File(filePath, fileName);
							if (!targetFile.exists()) {
								targetFile.mkdirs();
							}
							try {
								// 不在這裡執行檔案儲存
								// file[i].transferTo(targetFile);
								// loadfileName=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/kuangjia/loadImg/"+fileName;
								loadfileName = filePath + File.separator + fileName;// 本地路徑,上邊的是伺服器路徑
								listFile.add(targetFile);
								listFilePath.add(loadfileName);
								System.err.println("最後上傳的路徑:(儲存到資料庫的路徑)" + loadfileName);
							} catch (Exception e) {
								e.printStackTrace();
								request.setAttribute("fileError", "檔案上傳失敗");
								System.err.println("檔案儲存異常");
							}
						} else {
							request.setAttribute("fileError", "檔案上傳型別不符");
						}
					} else {
						System.out.println("出現假檔案,將假檔案從記憶體清理掉");
						file = clearFile(i, file);
					}
				}
			} else {
				request.setAttribute("fileError", "上傳檔案總數大於50MB");
			}
		}
		map.put("FilePath", listFilePath);
		map.put("File", listFile);
		map.put("MultipartFile", file);
		return map;
	}

	// 清理假檔案
	public static MultipartFile[] clearFile(int index, MultipartFile[] file) {
		MultipartFile[] fileNew = new MultipartFile[file.length - 1];
		for (int i = index; i < file.length; i++) {
			file[i] = file[i + 1];
		}
		System.arraycopy(file, 0, fileNew, 0, file.length);
		return fileNew;
	}

}

獲取檔名字尾工具類

public class FilenameUtils {
	public static String getExtensionName(String filename) {
		if ((filename != null) && (filename.length() > 0)) {
			int dot = filename.lastIndexOf('.');
			if ((dot > -1) && (dot < (filename.length() - 1))) {
				return filename.substring(dot + 1);
			}
		}
		return filename;
	}
}

控制器程式碼:
將檔案提交進去不會馬上儲存,可以執行完sql再進行儲存

public void webupload(HttpServletRequest request, HttpServletResponse response, MultipartFile[] fileimg) {
		Map map = FileLoad.load(request, response, fileimg);
		List<String> listpath = (List)map.get("FilePath");
		List<File> listFile = (List)map.get("File");
		MultipartFile[] file = (MultipartFile[])map.get("MultipartFile");
		
		/*
		 * 我假裝在這裡執行了sql
		 */
		
		//判斷儲存資料條數是否正常   如果sql執行沒有問題    再將檔案儲存在伺服器
		for(int i = 0; i < listFile.size(); i++) {
			try {
				file[i].transferTo(listFile.get(i));
			}catch (Exception e) {
				System.out.println("檔案儲存異常");
				request.setAttribute("fileError", "檔案儲存異常");
			}
		}
		System.out.println("儲存完畢");
	}

以下是一個webupload上傳demo,可以體驗一下
https://download.csdn.net/download/qq_43510878/10850082
在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述