文件上传 - s9797456/MyCommonCodeSnippets GitHub Wiki
package com.xinle.car.admin.common.util;
import java.io.File; import java.util.Arrays; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map;
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 liuzhen
-
@creation 2018年1月26日 */ public class FileUploadUtil {
private static final Logger logger = Logger.getLogger(FileUploadUtil.class);
//UploadUtil.java中apk上传限制大小;100M=2*1024*1024(B)=2097152 bytesprivate long maxSize = 104857600L; private String basePath = '/opt/taxi/file_upload/'; // 文件保存目录路径 private String saveFolder; private String fileUrl;
public static final String IMAGE = "images"; public static final String FLASH = "flashs"; public static final String APP = "app"; public static final String MEDIA = "medias"; public static final String FILE = "files";
private static Map<String, List> extMap = new HashMap<>(); static{ extMap.put(IMAGE, Arrays.asList("gif", "jpg", "jpeg", "png", "bmp")); extMap.put(FLASH, Arrays.asList("swf", "flv")); extMap.put(APP, Arrays.asList("apk")); extMap.put(MEDIA, Arrays.asList("swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", "asf", "rm", "rmvb")); extMap.put(FILE, Arrays.asList("doc", "docx", "xls", "xlsx", "ppt", "htm", "html", "txt", "zip", "rar", "gz", "bz2")); }
/**
-
文件上传 */ public Map<String, String> uploadFile(HttpServletRequest request, String uploadFileName, String type, String newName) throws Exception { Map<String, String> info = new HashMap<>(); MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request; MultipartFile file = mr.getFile(uploadFileName); String ofName = ""; if (file != null && file.getSize() > 0) { ofName = file.getOriginalFilename(); }
// 验证 String validateMsg = this.validateFields(request, type, ofName); info.put("validate", validateMsg); if(StringUtil.isBlank(validateMsg) || "true".equalsIgnoreCase(validateMsg)) { // 保存文件 info.put("saveMsg", this.saveFile(file, newName)); } // 文件最终的url包括文件名进行处理 if(fileUrl != null && fileUrl.trim() != "") { //对外服务器下载链接 String downLoadServer = Global.getConfig("download.server"); //把basePath给隐藏起来 fileUrl = fileUrl.replace("\", "/").replace(basePath, ""); //拼接起来 info.put("fileUrl", downLoadServer + fileUrl); }else { info.put("fileUrl", ""); } return info; } /**
-
保存文件
-
@param uploadFileName 上传控件file的name
-
@param request
-
@return */ public String saveFile(MultipartFile file, String newName) { String saveMsg = "false"; try { if (file != null && file.getSize() > 0) { try { File uploadFile = new File(saveFolder, newName); fileUrl = uploadFile.getPath(); // 将上传文件保存到一个目标文件当中 file.transferTo(uploadFile); saveMsg = "true"; // 上传成功 } catch (Exception e) { logger.error("调用FileUploadUtil上传报IOException错{}", e); } } else { saveMsg = "上传文件为空"; logger.error("上传文件为空"); } } catch (Exception e) { logger.error("文件上传发生未知错误,请联系系统管理员:{}", e); saveMsg = "文件上传发生未知错误,请联系系统管理员。"; } return saveMsg; }
/**
-
上传验证,并初始化文件目录 */ private String validateFields(HttpServletRequest request, String type, String originalFilename) { String validateMsg = "true"; try { //检查文件类型 if(null == extMap.get(type) || !checkExt(type, originalFilename)) { validateMsg = "上传类型不允许"; logger.info("上传类型不允许:" + type + "------," + originalFilename); return validateMsg; }
// 获取内容类型 String contentType = request.getContentType(); int contentLength = request.getContentLength(); // 文件保存目录路径 if(StringUtil.isNotBlank(basePath) && !basePath.endsWith("/")) { saveFolder = basePath + "/"; }else { saveFolder = basePath; } saveFolder += type + "/" + DateUtil.parseDate(Calendar.getInstance().getTime(), DateUtil.YYYYMMDD) + "/"; File uploadDir = new File(saveFolder); //文件上传类型和size检查 if (contentType == null || !contentType.startsWith("multipart")) { validateMsg = "请求不包含multipart/form-data流"; logger.error("请求不包含multipart/form-data流"); } else if (maxSize < contentLength) { String max = "上传文件大小超过限制,限制[" + bytes2Big(maxSize)+ "]"; validateMsg = max; logger.error(max); } else if (!ServletFileUpload.isMultipartContent(request)) { validateMsg = "请选择文件"; } else if (!uploadDir.isDirectory()) {// 检查保存文件夹,不存在时创建该文件夹 if (!uploadDir.exists()) { uploadDir.mkdirs(); } } else if (!uploadDir.canWrite()) { validateMsg = "上传目录[" + saveFolder + "]没有写权限"; } else if (!extMap.containsKey(type)) { validateMsg = "目录名不正确"; }}catch(Exception e) { logger.error("文件上传发生未知错误,请联系系统管理员:{}", e); validateMsg = "文件上传发生未知错误,请联系系统管理员。"; }
return validateMsg; }
private boolean checkExt(String type, String fileName) { String ext = ""; if(-1 != fileName.indexOf(".")) { ext = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); } if(null != extMap.get(type) && extMap.get(type).contains(ext)) { return true; } return false; }
/**
- byte(字节)根据长度转成kb(千字节)和mb(兆字节)和gb
*/
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";
}
}
}
-