文件上传工具类

package com.***.common.utils;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import javax.servlet.http.HttpServletRequest;

import com.***.common.framework.global.PropertiesConstant;
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;

/**
 * 文件上传工具类
 *
 * @author 
 * @date 2016-09-02
 * <p>
 * <pre>
 *       </pre>
 */
public class UploadUtils {
    /**
     * 表单字段常量
     */
    public static final String FORM_FIELDS = "form_fields";
    /**
     * 文件域常量
     */
    public static final String FILE_FIELDS = "file_fields";

    // 最大文件大小
    private long maxSize = 1000000;
    // 定义允许上传的文件扩展名
    private Map<String, String> extMap = new HashMap<String, String>();
    // 文件保存目录相对路径
    private String basePath = "upload";
    // 文件的目录名
    private String dirName = "files";
    // 上传临时路径
    private static final String TEMP_PATH = "/temp";
    private String tempPath = basePath + TEMP_PATH;
    // 若不指定则文件名默认为 yyyyMMddHHmmss_xyz
    private String fileNames;

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

    public UploadUtils() {
        // 其中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", "gif,jpg,jpeg,png,bmp,doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");
    }

    /**
     * 文件上传
     *
     * @param request
     * @return infos info[0] 验证文件域返回错误信息 info[1] 上传文件错误信息 info[2] savePath
     * info[3] saveUrl info[4] fileUrl
     */
    @SuppressWarnings("unchecked")
    public String[] uploadFile(HttpServletRequest request) {
        String[] infos = new String[7];
        // 验证
        infos[0] = this.validateFields(request);
        // 初始化表单元素
        Map<String, Object> fieldsMap = new HashMap<String, Object>();
        if (infos[0].equals("true")) {
            fieldsMap = this.initFields(request);
        }
        // 上传
        List<FileItem> fiList = (List<FileItem>) fieldsMap.get(UploadUtils.FILE_FIELDS);
        if (fiList != null) {
            for (FileItem item : fiList) {
                infos[1] = this.saveFile(item);
            }
            infos[2] = savePath;
            infos[3] = saveUrl;
            infos[4] = fileUrl;
            infos[5] = fileNames;
            infos[6] = filePath;
        }
        return infos;
    }

    /**
     * 上传验证,并初始化文件目录
     *
     * @param request
     */
    private String validateFields(HttpServletRequest request) {
        String errorInfo = "true";
        // boolean errorFlag = true;
        // 获取内容类型
        String contentType = request.getContentType();
        int contentLength = request.getContentLength();
        // 文件保存目录路径
        savePath = PropertiesUtil.getProperty(PropertiesConstant.UPLOAD_FILE) + "/" + basePath + "/";//request.getSession().getServletContext().getRealPath("/") + basePath + "/";
        File saveFile = new File(savePath);
        if (!saveFile.exists()) {
            saveFile.mkdirs();
        }
        // 文件保存目录URL
        saveUrl = request.getContextPath() + "/" + basePath + "/";
        File uploadDir = new File(savePath);
        if (contentType == null || !contentType.startsWith("multipart")) {
            errorInfo = "请求不包含multipart/form-data流";
        } else if (maxSize < contentLength) {
            errorInfo = "上传文件大小超出文件最大大小[" + maxSize + "]";
        } else if (!ServletFileUpload.isMultipartContent(request)) {
            errorInfo = "请选择文件";
        } else if (!uploadDir.isDirectory()) {// 检查目录
            errorInfo = "上传目录[" + savePath + "]不存在";
        } 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 = PropertiesUtil.getProperty(PropertiesConstant.UPLOAD_FILE) + tempPath + "/";//request.getSession().getServletContext().getRealPath("/") + tempPath + "/";
            File file = new File(tempPath);
            if (!file.exists()) {
                file.mkdirs();
            }
        }

        return errorInfo;
    }

    /**
     * 处理上传内容
     *
     * @param request
     * @param maxSize
     * @return
     */
    // @SuppressWarnings("unchecked")
    private Map<String, Object> initFields(HttpServletRequest request) {

        // 存储表单字段和非表单字段
        Map<String, Object> map = new HashMap<String, Object>();

        // 第一步:判断request
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        // 第二步:解析request
        if (isMultipart) {
            // Create a factory for disk-based file items
            DiskFileItemFactory factory = new DiskFileItemFactory();

            // 阀值,超过这个值才会写到临时目录,否则在内存中
            factory.setSizeThreshold(1024 * 1024 * 10);
            factory.setRepository(new File(tempPath));

            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);

            upload.setHeaderEncoding("UTF-8");

            // 最大上传限制
            upload.setSizeMax(maxSize);

            /* FileItem */
            List<FileItem> items = null;
            // Parse the request
            try {
                items = upload.parseRequest(request);
            } catch (FileUploadException e) {
                e.printStackTrace();
            }

            // 第3步:处理uploaded items
            if (items != null && items.size() > 0) {
                Iterator<FileItem> iter = items.iterator();
                // 文件域对象
                List<FileItem> list = new ArrayList<FileItem>();
                // 表单字段
                Map<String, String> fields = new HashMap<String, String>();
                while (iter.hasNext()) {
                    FileItem item = iter.next();
                    // 处理所有表单元素和文件域表单元素
                    if (item.isFormField()) { // 表单元素
                        String name = item.getFieldName();
                        String value = item.getString();
                        fields.put(name, value);

        //普通字段              

        //out.print(item.getFieldName());//得到字段name属性的值   

        //out.print(item.getString("UTF-8"));//得到字段的值

        String  desc = item.getString("UTF-8");


                    } else { // 文件域表单元素

            //文件字段 

        //out.print("--------------");

        //out.print(item.getFieldName()); 

        //out.println(item.getContentType());//文件类型《application/pdf》 

        //out.println(item.getName());//文件名称《入门.pdf》


                        list.add(item);
                    }
                }
                map.put(FORM_FIELDS, fields);
                map.put(FILE_FIELDS, list);
            }
        }
        return map;
    }

    /**
     * 保存文件
     *
     * @param obj  要上传的文件域
     * @param file
     * @return
     */
    private String saveFile(FileItem item) {
        String error = "true";
        String fileName = item.getName();
        String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();

        if (item.getSize() > maxSize) { // 检查文件大小
            error = "上传文件大小超过限制";
        } else if (!Arrays.<String>asList(extMap.get(dirName).split(",")).contains(fileExt)) {// 检查扩展名
            error = "上传文件扩展名是不允许的扩展名。 只允许" + 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;
            }
            // .../basePath/dirName/yyyyMMdd/yyyyMMddHHmmss_xxx.xxx
            if (StringUtils.isBlank(fileUrl)) {
                fileUrl = saveUrl + newFileName;
                fileNames = newFileName;
                filePath = savePath + newFileName;
            } else {
                fileUrl += ";" + saveUrl + newFileName;
                fileNames += ";" + newFileName;
                filePath += ";" + savePath + newFileName;
            }

            try {
                File uploadedFile = new File(savePath, newFileName);

                item.write(uploadedFile);

//以下棕色代码为注释掉的内容

// 文件全在内存中

   FileOutputStream fos = new FileOutputStream(uploadFile);
if (item.isInMemory()) {
fos.write(item.get());
} else {
InputStream is = item.getInputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
is.close();
}
fos.close();
item.delete();

 


    /**
     * *********************get/set方法*********************************
     */

    public String getSavePath() {
        return savePath;
    }

    public String getSaveUrl() {
        return saveUrl;
    }

    public long getMaxSize() {
        return maxSize;
    }

    public void setMaxSize(long maxSize) {
        this.maxSize = maxSize;
    }

    public Map<String, String> getExtMap() {
        return extMap;
    }

    public void setExtMap(Map<String, String> extMap) {
        this.extMap = extMap;
    }

    public String getBasePath() {
        return basePath;
    }

    public void setBasePath(String basePath) {
        this.basePath = basePath;
        tempPath = basePath + TEMP_PATH;
    }

    public String getDirName() {
        return dirName;
    }

    public void setDirName(String dirName) {
        this.dirName = dirName;
    }

    public String getTempPath() {
        return tempPath;
    }

    public void setTempPath(String tempPath) {
        this.tempPath = tempPath;
    }

    public String getFileUrl() {
        return fileUrl;
    }

    public String getFileNames() {
        return fileNames;
    }

    public void setFileNames(String fileNames) {
        this.fileNames = fileNames;
    }

}

原文地址:https://www.cnblogs.com/esther-qing/p/6140948.html