首页 > 代码库 > java FileUpload 组件上传文件

java FileUpload 组件上传文件

Commons FileUpload

Apache提供的一个组件,可以很方便的让我们处理客户端上传的文件,

下载地址 http://commons.apache.org/proper/commons-fileupload/

下载commons-fileupload.jar,还有其依赖包 commons-io.jar一同下载好,导入工程

有点奇葩的是,在tomcat下已经把這个组建集成了,但是不能正常使用,其源码基本上是一样的。

正确的包名应该是這个:org.apache.commons.fileupload.

而不是org.apache.tomcat.util.http.fileupload.下面的

 

最简单的使用

 1 protected void doPost(HttpServletRequest request, 2             HttpServletResponse response) throws ServletException, IOException { 3  4         ServletContext servletContext = this.getServletContext(); 5  6         // 指定保存文件的位置,放在WEB-INF目录下是为了保证系统的安全性 7         String savePath = servletContext.getRealPath("/WEB-INF/upload"); 8         System.out.println("savePath=" + savePath); 9 10         if (ServletFileUpload.isMultipartContent(request)) {11 12             try {13                 // 创建FileItem的工厂14                 DiskFileItemFactory factory = new DiskFileItemFactory();24                 // 创建一个FileItem的解析器,根据前面设置好的工厂得到25                 ServletFileUpload upload = new ServletFileUpload(factory);26 27                 // 解析出FIleItem项,parserRequest接收的类型是28                 // javax.servlet.http.HttpServletRequest29                 List<FileItem> items = upload.parseRequest(request);30 31                 // 遍历FileItem,检查是否为普通字符还是文件流32                 for (FileItem item : items) {33 34                     // 普通表单文字35                     if (item.isFormField()) {36                         // 表单上的name37                         String name = item.getFieldName();38                         // 表单上的value39                         String value =http://www.mamicode.com/ item.getString();40 41                         System.out.println("name=" + name42                                 + "   ----------   value="http://www.mamicode.com/+ value);43 44                         // 数据库操作。。45                     } else {46                         // 文件一般从网络上传后存放到数据库,而原来的文件将采用不重复的命名方案存放47                         String fileName = item.getName();// 文件名,可能是带全路径的或者就是文件名48                         System.out.println("上传文件全路径:" + fileName);49                         fileName = fileName.substring(fileName50                                 .lastIndexOf("\\") + 1);// IE51                                                         // 、Opera52                         System.out.println("上传文件名:" + fileName);53 54                         // 没有上传文件55                         if (fileName.equals("")) {56                             break;57                         }58                         InputStream in = item.getInputStream();59                         FileOutputStream fos = new FileOutputStream(savePath60                                 + "\\" + fileName);61 62                         byte[] b = new byte[1024];63                         int len = 0;64                         while ((len = in.read(b)) != -1) {65                             fos.write(b, 0, len);66                         }67 68                         in.close();69                         fos.close();70 71                     }72                 }73 74             } catch (FileUploadException e) {75                 // TODO Auto-generated catch block76                 e.printStackTrace();77             }78 79         } else {80             response.getWriter().write("no multipart/form-data submit");81         }82     }83     

 

设置一下高级的用法:

修改默认设置,设置限制上传大小,返回当前上传进度。。

protected void doPost(HttpServletRequest request,            final HttpServletResponse response) throws ServletException,            IOException {        response.setContentType("text/html;charset=UTF-8");        ServletContext servletContext = this.getServletContext();        // 指定保存文件的位置,放在WEB-INF目录下是为了保证系统的安全性        String savePath = servletContext.getRealPath("/WEB-INF/upload");        System.out.println("savePath=" + savePath);        if (ServletFileUpload.isMultipartContent(request)) {            try {                // 创建FileItem的工厂                DiskFileItemFactory factory = new DiskFileItemFactory();                // 设置FileItem工厂的一些属性                File repository = (File) servletContext                        .getAttribute("javax.servlet.context.tempdir"); // 得到用户临时文件夹                System.out.println("temp position:" + repository.getPath());                factory.setRepository(repository); // 设置临时的存储位置                factory.setSizeThreshold(1024 * 100);// 设置缓存大小为100kb,默认为10K,以字节为单位                // 创建一个FileItem的解析器,根据前面设置好的工厂得到                ServletFileUpload upload = new ServletFileUpload(factory);                // 设置允许上传的最大值,超出则拒绝上传                upload.setSizeMax(1024 * 1000);                // 设置上传时的进度条监听器                ProgressListener pListener = new ProgressListener() {                    @Override                    public void update(long pBytesRead, long pContentLength,                            int pItems) {                        try {                            response.getWriter().write(                                    "上传第"                                            + pItems                                            + "文件      上传进度:"                                            + (pBytesRead * 1.0                                                    / pContentLength * 100)                                            + "%<br/>");                        } catch (IOException e) {                            e.printStackTrace();                        }                    }                };                upload.setProgressListener(pListener);                // 解析出FIleItem项,parserRequest接收的类型是                // javax.servlet.http.HttpServletRequest                List<FileItem> items = upload.parseRequest(request);                // 遍历FileItem,检查是否为普通字符还是文件流                for (FileItem item : items) {                    // 普通表单文字                    if (item.isFormField()) {                        // 表单上的name                        String name = item.getFieldName();                        // 表单上的value                        String value =http://www.mamicode.com/ item.getString();                        System.out.println("name=" + name                                + "   ----------   value="http://www.mamicode.com/+ value);                        // 数据库操作。。                    } else {                        // 文件一般从网络上传后存放到数据库,而原来的文件将采用不重复的命名方案存放,System.currentTime                        String fileName = item.getName();// 文件名,可能是带全路径的或者就是文件名                        System.out.println("上传文件全路径:" + fileName);                        fileName = fileName.substring(fileName                                .lastIndexOf("\\") + 1);// IE                                                        // 、Opera                        System.out.println("上传文件名:" + fileName);                        // 没有上传文件                        if (fileName.equals("")) {                            break;                        }                        InputStream in = item.getInputStream();                        FileOutputStream fos = new FileOutputStream(savePath                                + "\\" + getFileName(fileName));                        byte[] b = new byte[1024];                        int len = 0;                        while ((len = in.read(b)) != -1) {                            fos.write(b, 0, len);                        }                        in.close();                        fos.close();                    }                }            } catch (SizeLimitExceededException e1) {                response.getWriter().write("超出大小啦。。");            } catch (FileUploadException e) {                response.getWriter().write("上传失败了。。");                e.printStackTrace();            }        } else {            response.getWriter().write("no multipart/form-data submit");        }    }    String getFileName(String fileName) {        Date date = new Date(System.currentTimeMillis());        String result = DateFormat.getDateInstance(DateFormat.SHORT).format(                date)                + "_" + fileName;        return result;    }

 




首先是
ServletFileUpload.isMultipartContent(request) 判断是否带有文件数据的表单

其内部其实还是调用了request.getContentType()的方法的

ServletUpload
1     public static final boolean isMultipartContent(2             HttpServletRequest request) {3         if (!POST_METHOD.equalsIgnoreCase(request.getMethod())) {4             return false;5         }6         return FileUploadBase.isMultipartContent(new ServletRequestContext(request));7     }

 

FileUploadBase

 1   public static final boolean isMultipartContent(RequestContext ctx) { 2         String contentType = ctx.getContentType(); 3         if (contentType == null) { 4             return false; 5         } 6         if (contentType.toLowerCase(Locale.ENGLISH).startsWith(MULTIPART)) { 7             return true; 8         } 9         return false;10     }

 

java FileUpload 组件上传文件