1. 程式人生 > >spring mvc 上傳檔案幫助類(留備用)

spring mvc 上傳檔案幫助類(留備用)

package com.service.impl;

import com.entity.UploadInfo;
import com.service.UploadHelp;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import com.common.Prompt;

//import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Arrays;

import javax.servlet.ServletContext;
//import javax.imageio.ImageIO;

/**
 * 上傳檔案幫助類
 * 
 * @author mingqi_QIAN 建立日期2018-10-16
 */
public class UploadHelpImpl implements UploadHelp {

	/**
	 * 上傳檔案
	 * 
	 * @param file       檔案
	 * @param folder     資料夾
	 * @param suffixName 限制的上傳副檔名的集合
	 * @param maxSize    限制的最大上傳大小
	 * @return prompt
	 */
	@Override
	public Prompt uploadFile(CommonsMultipartFile file, String folder, String[] suffixName, long maxSize) {
		System.out.println(folder);
		Prompt prompt = new Prompt();// 訊息提示實體類物件
		String fileName = file.getOriginalFilename();// 獲取檔名
		String fileSuffix = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();// 獲取字尾
		String newFileName = String.valueOf(System.currentTimeMillis()) + fileSuffix;// 重新命名檔名
		String filePath = getPath(folder).getAbsolutePath();// 獲取路徑
		System.out.println(filePath);
		String savePath = filePath + "\\" + newFileName;// 儲存檔案及檔案路徑
		System.out.println(savePath);
		// 檢查資料夾是否在,不存在建立它
		File folders = new File(filePath);
		if (!folders.exists() && !folders.isDirectory()) {
			folders.mkdir();
		}
		// 限制檔案上傳型別
		long fileSize = file.getSize();
		if (!checkFileSuffix(fileSuffix, suffixName)) {
			prompt.setCode(2);
			prompt.setMessage("請選擇允許上傳的檔案!");
		} else {
			// 限制檔案上傳大小
			if (fileSize > maxSize) {
				prompt.setCode(3);
				prompt.setMessage("檔案超過制限大小!");
			} else {
				try {
					// 寫入路徑
					file.transferTo(new File(savePath));
					prompt.setCode(1);
					prompt.setMessage("上傳成功!");
					// 將檔案屬性以實體物件形式裝
					UploadInfo uploadInfo = new UploadInfo();
					uploadInfo.setFileName(newFileName);
					uploadInfo.setOldFileName(fileName);
					uploadInfo.setFileSize(String.valueOf(fileSize));
					uploadInfo.setFilePath(getPath(folder).getRelativePath()+"/UpLoad/" + folder);
					uploadInfo.setFileSuffixName(fileSuffix);
					// 如果上傳的是圖片,獲取圖片的寬高,經測試 此處只支援png獲取,jpg會出錯
//					String[] images = new String[] { ".jpg", ".gif", ".png",".jpeg",".bmp" };
//					if (Arrays.asList(images).contains(fileSuffix)) {
//						BufferedImage image = ImageIO.read(file.getInputStream());
//						if (image != null) {
//							uploadInfo.setFileWidth(image.getWidth());
//							uploadInfo.setFileHeight(image.getHeight());
//						}
//					}
					// 將檔案屬性實體加入訊息體中
					prompt.setDatas(uploadInfo);
				} catch (Exception e) {
					prompt.setCode(0);
					prompt.setMessage("上傳失敗");
				}

			}

		}
		return prompt;
	}

	/**
	 * 檢查上傳檔案型別
	 * 
	 * @param filesuffix 檔案字尾名
	 * @param suffixName 允許上傳的字尾陣列
	 * @return
	 */
	private boolean checkFileSuffix(String filesuffix, String suffixName[]) {
		String[] suffixNames = suffixName;
		if (Arrays.asList(suffixNames).contains(filesuffix)) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 獲取儲存路徑
	 * 
	 * @param folder 資料夾
	 * @return
	 */
	private Pathstr getPath(String folder) {
		WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
		ServletContext servletContext = webApplicationContext.getServletContext();
		Pathstr pathstr = new Pathstr();
		// 得到檔案絕對路徑
		pathstr.setAbsolutePath(servletContext.getRealPath("/UpLoad/" + folder));
		// 得到檔案相對路徑
		pathstr.setRelativePath(servletContext.getContextPath());
		return pathstr;
	}
}

/**
 * 取得路徑
 * 
 * @author mingqi_QIAN
 *
 */
class Pathstr {
	private String relativePath;// 相對路徑
	private String absolutePath;// 絕對路徑

	/**
	 * 相對路徑
	 * 
	 * @return
	 */
	public String getRelativePath() {
		return relativePath;
	}

	/**
	 * 獲得相對路徑
	 * 
	 * @param relativePath
	 */
	public void setRelativePath(String relativePath) {
		this.relativePath = relativePath;
	}

	/**
	 * 絕對路徑
	 * 
	 * @return
	 */
	public String getAbsolutePath() {
		return absolutePath;
	}

	/**
	 * 獲得絕對路徑
	 * 
	 * @param absolutePath
	 */
	public void setAbsolutePath(String absolutePath) {
		this.absolutePath = absolutePath;
	}
}