上传图片 - 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";
}
}
}