上传图片 - s9797456/MyCommonCodeSnippets GitHub Wiki

package com.xinle.car.admin.common.util;

import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Random;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.log4j.Logger; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest;

import com.heinqi.yangtes.jee.commons.config.Global;

/**

  • 文件/图片上传 通用方法类
  • @author lenovo

*/ public class UploadUtil { private static Logger log = Logger.getLogger(UploadUtil.class);

// 读取yangtes.properties设置的图片上传限制大小,这里应该从.properties配置文件中获取。10M=10*1024*1024(B)=10485760 bytes
private long maxSize = Long.valueOf(Global.getConfig("web.image.maxUploadSize")); 
// 定义允许上传的文件扩展名
private Map<String, String> extMap = new HashMap<String, String>();
// 文件保存目录相对路径,该路径要建在springmvc项目的/src/main/webapp/下,否则会找不到
private String basePath = "upload";
// 文件的目录名
private String dirName = "images";
// 上传临时路径
private static final String TEMP_PATH = "/temp";
private String tempPath = basePath + TEMP_PATH;
// 若不指定则文件名默认为 yyyyMMddHHmmss_xyz
private String fileName = "";

// 文件保存目录路径
private String savePath;
// 文件保存目录url
private String saveUrl;
// 文件最终的url包括文件名
private String fileUrl;

public UploadUtil() {
	// 其中images,flashs,medias,files,对应文件夹名称,对应dirName
	// key文件夹名称
	// value该文件夹内可以上传文件的后缀名
	extMap.put("images", "gif,jpg,jpeg,png,bmp");
	extMap.put("flashs", "swf,flv");
	extMap.put("medias", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
	extMap.put("files", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");
}

/**
 * 文件上传
 * @param uploadFileName file控件id(name)
 * @param request
 * @return info
 * info[validate] 验证文件域返回错误信息
 * info[saveMsg]  上传文件错误信息
 * info[savePath] 文件保存目录路径
 * info[saveUrl]  文件保存目录url
 * info[fileUrl]  文件最终的url包括文件名(不包括站点名)
 */
public Map<String, String> uploadFile(String uploadFileName, HttpServletRequest request) {
	Map<String, String> info = new HashMap<>();
	// 验证
	info.put("validate", this.validateFields(request));
	// 保存文件
	info.put("saveMsg", this.saveFile(uploadFileName, request));
	//info.put("savePath", savePath);
	//info.put("saveUrl", saveUrl);
	// 文件最终的url包括文件名进行处理
	if(fileUrl != null && fileUrl.trim() != "") {
		// 获取站点根目录
		String contextPath = request.getContextPath();
		// 剔除项目路径:/项目名(站点根目录)/upload/images/20171221/1.jpg
		fileUrl = fileUrl.substring(contextPath.length(), fileUrl.length());
		info.put("fileUrl", fileUrl);
	}else {
		info.put("fileUrl", "");
	}
	return info;
}

/**
 * 保存文件
 * @param uploadFileName 上传控件file的name
 * @param request
 * @return
 */
public String saveFile(String uploadFileName, HttpServletRequest request) {
	String error = "false";
	try {
		/*MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
		MultipartHttpServletRequest mr = resolver.resolveMultipart(request);*/
		MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request;
		MultipartFile file = mr.getFile(uploadFileName);
		if (file != null && file.getSize() > 0) {
			String ofName = file.getOriginalFilename();
			String fileExt = ofName.substring(ofName.lastIndexOf(".") + 1).toLowerCase();

			if (file.getSize() > maxSize) { // 检查文件大小
				String max = "上传文件大小超过限制,限制[" + bytes2Big(maxSize)+ "]";
				error = max;
			} else if (!Arrays.<String> asList(extMap.get(dirName).split(",")).contains(fileExt)) {// 检查扩展名
				error = "上传文件扩展名是不允许的扩展名。\n只允许" + extMap.get(dirName) + "格式。";
			} else {
				String newFileName;
				if ("".equals(fileName.trim())) {
					SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
					newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;
				} else {
					newFileName = fileName + "." + fileExt;
				}
				// .../basePath/dirName/yyyyMMdd/yyyyMMddHHmmss_xxx.xxx
				fileUrl = saveUrl + newFileName;
				try {
					File uploadFile = new File(savePath, newFileName);
					// 将上传文件保存到一个目标文件当中
					file.transferTo(uploadFile);
					error = "true"; // 上传成功
				} catch (IOException e) {
					log.error(e);
					System.out.println("调用UploadUtil上传报IOException错");
					e.printStackTrace();
				} catch (Exception e) {
					log.error(e);
					System.out.println("调用UploadUtil上传报Exception错");
					e.printStackTrace();
				}
			}
		} else {
			error = "上传文件为空";
		}
	} catch (Exception e) {
		error = "上传文件报错";
		log.error(e);
	}
	return error;
}

/**
 * 上传验证,并初始化文件目录
 * 
 * @param request
 */
private String validateFields(HttpServletRequest request) {
	String errorInfo = "true";
	// 获取内容类型
	String contentType = request.getContentType();
	int contentLength = request.getContentLength();
	// 文件保存目录路径
	savePath = request.getSession().getServletContext().getRealPath("/") + basePath + "/";
	// 文件保存目录URL
	saveUrl = request.getContextPath() + "/" + basePath + "/";
	File uploadDir = new File(savePath);
	if (contentType == null || !contentType.startsWith("multipart")) {
		System.out.println("请求不包含multipart/form-data流");
		errorInfo = "请求不包含multipart/form-data流";
	} else if (maxSize < contentLength) {
		String max = "上传文件大小超过限制,限制[" + bytes2Big(maxSize)+ "]";
		System.out.println(max);
		errorInfo = max;
	} else if (!ServletFileUpload.isMultipartContent(request)) {
		errorInfo = "请选择文件";
	} else if (!uploadDir.isDirectory()) {// 检查保存文件夹,不存在时创建该文件夹
		//errorInfo = "上传目录[" + savePath + "]不存在";
		if (!uploadDir.exists()) {
			uploadDir.mkdirs();
		}
	} else if (!uploadDir.canWrite()) {
		errorInfo = "上传目录[" + savePath + "]没有写权限";
	} else if (!extMap.containsKey(dirName)) {
		errorInfo = "目录名不正确";
	} else {
		// .../basePath/dirName/
		// 创建文件夹
		savePath += dirName + "/";
		saveUrl += dirName + "/";
		File saveDirFile = new File(savePath);
		if (!saveDirFile.exists()) {
			saveDirFile.mkdirs();
		}
		// .../basePath/dirName/yyyyMMdd/
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String ymd = sdf.format(new Date());
		savePath += ymd + "/";
		saveUrl += ymd + "/";
		File dirFile = new File(savePath);
		if (!dirFile.exists()) {
			dirFile.mkdirs();
		}

		// 获取上传临时路径
		tempPath = request.getSession().getServletContext().getRealPath("/") + tempPath + "/";
		File file = new File(tempPath);
		if (!file.exists()) {
			file.mkdirs();
		}
	}

	return errorInfo;
}

/** 
 * byte(字节)根据长度转成kb(千字节)和mb(兆字节)和gb
 *  
 * @param bytes 
 * @return 
 */  
public static String bytes2Big(long size) {  
	//如果字节数少于1024,则直接以B为单位,否则先除于1024,后3位因太少无意义  
    if (size < 1024) {  
        return String.valueOf(size) + "B";  
    } else {  
        size = size / 1024;  
    }  
    //如果原字节数除于1024之后,少于1024,则可以直接以KB作为单位  
    //因为还没有到达要使用另一个单位的时候  
    //接下去以此类推  
    if (size < 1024) {  
        return String.valueOf(size) + "KB";  
    } else {  
        size = size / 1024;  
    }  
    if (size < 1024) {  
        //因为如果以MB为单位的话,要保留最后1位小数,  
        //因此,把此数乘以100之后再取余  
        size = size * 100;  
        return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "MB";  
    } else {  
        //否则如果要以GB为单位的,先除于1024再作同样的处理  
        size = size * 100 / 1024;  
        return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "GB";  
    }    
}  

}

⚠️ **GitHub.com Fallback** ⚠️