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

    }

  • 相关阅读:
    用 ArcMap 发布 ArcGIS Server FeatureServer Feature Access 服务 PostgreSQL 版本
    ArcMap 发布 ArcGIS Server OGC(WMSServer,MapServer)服务
    ArcScene 创建三维模型数据
    ArcMap 导入自定义样式Symbols
    ArcMap 导入 CGCS2000 线段数据
    ArcMap 导入 CGCS2000 点坐标数据
    ArcGis Server manager 忘记用户名和密码
    The view or its master was not found or no view engine supports the searched locations
    python小记(3)操作文件
    pytest(2) pytest与unittest的区别
  • 原文地址:https://www.cnblogs.com/esther-qing/p/6140948.html
Copyright © 2011-2022 走看看