package org.framework.helper; //~--- non-JDK imports -------------------------------------------------------- import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.framework.bean.FileParam; import org.framework.bean.FormParam; import org.framework.bean.Param; import org.framework.util.CollectionUtil; import org.framework.util.FileUtil; import org.framework.util.StreamUtil; import org.framework.util.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; //~--- JDK imports ------------------------------------------------------------ import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; /** * 文件上传助手类 * Created by lizhaoz on 2015/12/31. */ public class UploadHelper { private static final Logger LOGGER = LoggerFactory.getLogger(UploadHelper.class); // Apache Commons FileUpload提供的Servlet文件上传对象 private static ServletFileUpload servletFileUpload; /** * 、初始化servletFileUpload * author:Lizhao * Date:15/12/31 * version:1.0 * * @param servletContext */ public static void init(ServletContext servletContext) { // 得到servlet缓存目录 如果用的是tomcat就是work\Catalina\localhost\ServletConfigContext File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir"); // 默认大小10kb保存在内存中,如果超出了就保存在磁盘中 servletFileUpload = new ServletFileUpload(new DiskFileItemFactory(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD, repository)); int uploadLimit = ConfigHelper.getAppUploadLimit(); if (uploadLimit != 0) { // 设置上传限制 servletFileUpload.setFileSizeMax(uploadLimit * 1024 * 1024); } } /** * 判断请求是否为multipart * author:Lizhao * Date:15/12/31 * version:1.0 * * @param request * * @return */ public static boolean isMultipart(HttpServletRequest request) { return ServletFileUpload.isMultipartContent(request); } /** * 初始化Param参数 * 把两种请求参数填充 * author:Lizhao * Date:15/12/31 * version:1.0 * * @param request * * @return * * @throws IOException */ public static Param createParam(HttpServletRequest request) throws IOException { // 两种参数列表 List<FormParam> formParamList = new ArrayList<FormParam>(); List<FileParam> fileParamList = new ArrayList<FileParam>(); try { // 解析请求参数 Map<String, List<FileItem>> fileItemListMap = servletFileUpload.parseParameterMap(request); if (CollectionUtil.isNotEmpty(fileItemListMap)) { for (Map.Entry<String, List<FileItem>> fileItemListEntry : fileItemListMap.entrySet()) { // 得到 String fieldName = fileItemListEntry.getKey(); // 得到文件列表 List<FileItem> fileItemList = fileItemListEntry.getValue(); if (CollectionUtil.isNotEmpty(fileItemList)) { for (FileItem fileItem : fileItemList) { if (fileItem.isFormField()) { String fieldValue = fileItem.getString("UTF-8"); formParamList.add(new FormParam(fieldName, fieldValue)); } else { String fileName = FileUtil.getRealFileName(new String(fileItem.getName().getBytes(), "UTF-8")); if (StringUtil.isNotEmpty(fileName)) { long fileSize = fileItem.getSize(); String contentType = fileItem.getContentType(); InputStream inputSteam = fileItem.getInputStream(); fileParamList.add(new FileParam(fieldName, fileName, fileSize, contentType, inputSteam)); } } } } } } } catch (FileUploadException e) { LOGGER.error("create param failure", e); throw new RuntimeException(e); } return new Param(formParamList, fileParamList); } /** * 单文件上传 * author:Lizhao * Date:15/12/31 * version:1.0 * * @param basePath * @param fileParam */ public static void uploadFile(String basePath, FileParam fileParam) { try { if (fileParam != null) { // 通过文件夹地址和文件名字得到文件地址 String filePath = basePath + fileParam.getFileName(); FileUtil.createFile(filePath); InputStream inputStream = new BufferedInputStream(fileParam.getInputStream()); // 输出到该地址,文件上传过程 OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(filePath)); StreamUtil.copyStream(inputStream, outputStream); } } catch (Exception e) { LOGGER.error("upload file failure", e); throw new RuntimeException(e); } } /** * 批量上传文件 * author:Lizhao * Date:15/12/31 * version:1.0 * * @param basePath * @param fileParamList */ public static void uploadFile(String basePath, List<FileParam> fileParamList) { try { if (CollectionUtil.isNotEmpty(fileParamList)) { for (FileParam fileParam : fileParamList) { uploadFile(basePath, fileParam); } } } catch (Exception e) { LOGGER.error("upload file failure", e); throw new RuntimeException(e); } } } //~ Formatted by Jindent --- http://www.jindent.com