文件上传 - 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 bytes
    

    private 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";
      }
      }
      }
⚠️ **GitHub.com Fallback** ⚠️