zoukankan      html  css  js  c++  java
  • 文件上传工具类

    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;
        }

    }

  • 相关阅读:
    [转]如何才能在 IIS 7.5 使用 Windows PowerShell SnapIn 功能
    VS2010 生成序列图实例
    Jquery Ajax调用asmx出错问题
    [转载]通过HttpWebRequest在后台对WebService进行调用
    手机网站自适应
    sqlserver内存释放
    程序集强命名的作用
    MVP,MVVM,MVC
    浮点类型的特殊性知多少
    Directly querying the BizTalk database for suspended messages
  • 原文地址:https://www.cnblogs.com/esther-qing/p/6140948.html
Copyright © 2011-2022 走看看