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.HttpServletRequest
29                 List<FileItem> items = upload.parseRequest(request);
30
31                 // 遍历FileItem,检查是否为普通字符还是文件流
32                 for (FileItem item : items) {
33
34                     // 普通表单文字
35                     if (item.isFormField()) {
36                         // 表单上的name
37                         String name = item.getFieldName();
38                         // 表单上的value
39                         String value = item.getString();
40
41                         System.out.println("name=" + name
42                                 + "   ----------   value=" + value);
43
44                         // 数据库操作。。
45                     } else {
46                         // 文件一般从网络上传后存放到数据库,而原来的文件将采用不重复的命名方案存放
47                         String fileName = item.getName();// 文件名,可能是带全路径的或者就是文件名
48                         System.out.println("上传文件全路径:" + fileName);
49                         fileName = fileName.substring(fileName
50                                 .lastIndexOf("\\") + 1);// IE
51                                                         // 、Opera
52                         System.out.println("上传文件名:" + fileName);
53
54                         // 没有上传文件
55                         if (fileName.equals("")) {
56                             break;
57                         }
58                         InputStream in = item.getInputStream();
59                         FileOutputStream fos = new FileOutputStream(savePath
60                                 + "\\" + 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 block
76                 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 = item.getString();

                        System.out.println("name=" + name
                                + "   ----------   value=" + 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     }
时间: 2024-12-08 04:31:39

java FileUpload 组件上传文件的相关文章

JSP页面/Apache FileUpload组件上传文件的同时,传递其他参数的方法

Spring3.0+Apache Tomcatv7.0+JDK1.7.0_u45+J2EE1.4验证通过. 需求:使用JSP页面上传文件时,同时需要传递相关参数. 1.  需要将form设置为enctype="multipart/form-data"method="post"参数: 2.  由于此时URL参数不能通过request.getParameter()获得,所以为了让@RequestMapping中设置的params="command=upload

使用commons-fileUpload组件上传文件

在近期的一个项目中有用到commons-fileUpload组件进行实现文件上传的功能(由于没用到框架),在使用的过程中有遇到一些问题,经过自己的琢磨也算顺利地将其解决了,在这里做个记录. 一.commons-fileUpload文件上传组件简介 commons-fileUpload上传组件是Apache的一个开源项目,可以到http://commons.apache.org/proper/commons-fileupload/下载最新版本(该组件需要commons-io包的支持).该组件使用方

java使用httpcomponents 上传文件

一.httpcomponents简介 httpcomponents 是apache下的用来负责创建和维护一个工具集的低水平Java组件集中在HTTP和相关协议的工程.我们可以用它在代码中直接发送http请求,而无需用到页面的js去完成.该项目由一下几个部分组成: 1.HttpComponents Core: HttpCore 是一套的低级别的 HTTP 传输组件可用于构建自定义客户端和服务器端 HTTP 服务与一个最小的足迹.HttpCore 支持两种模型: 阻止基于经典 Java I/O 和非

关于云储存或者百度云的基础问题, 用java/android 实现上传文件到云储存(比如百度云)

============问题描述============ 关于云储存或者百度云的基础问题, 用java/android 实现上传文件到云储存(比如百度云) ============解决方案1============ 参考百度相关api

Java使用HttpURLConnection上传文件

从普通Web页面上传文件很简单,只需要在form标签叫上enctype="multipart/form-data"即可,剩余工作便都交给浏览器去完成数据收集并发送Http请求.但是如果没有页面的话要怎么上传文件呢? 由于脱离了浏览器的环境,我们就要自己去完成数据的收集并发送请求,所以就很麻烦了.首先我们来写个JSP页面并看看浏览器发出的Http请求是什么样的 JSP页面: <html> <head> <meta charset="UTF-8&qu

Java Servlet 接收上传文件

在Java中使用 Servlet 来接收用户上传的文件,需要用到两个apache包,分别是 commons-fileupload 和 commons-io 包: 如果直接在doPost中,使用request.getInputStream()获取ServletInputStream,这样获取到的Stream是不能直接写入文件的,比如上传一个txt文件,你会发现保存下来的txt文件不只有原本txt文件本身的内容,里面还有post请求的一些参数,比如参数分割符等: 下面就是一个使用fileupload

java使用ftp上传文件

ftpServer是apache MINA项目的一个子项目,它实现了一个ftp服务器,与vsftpd是同类产品.Filezilla是一个可视化的ftp服务器. ftp客户端也有很多,如Filezilla,FlashFXP,SmartFtp等,其中只有Filezilla是免费的. 今天使用Filezilla上传文件总是失败,一直显示 错误: 20 秒后无活动,连接超时 错误: 文件传输失败 用FlashFXP却可以很正常上传文件,但FlashFXP试用期只有30天,网上搜索注册码未果,遂想学学ja

django Form组件 上传文件

上传文件 注意:FORM表单提交文件要有一个参数enctype="multipart/form-data" 普通上传: urls: url(r'^f1/',views.f1), url(r'^f2/',views.f2), views: def f1(request): if request.method == "GET": return render(request,'f1.html') else: import os #导入os模块 #request.get /

使用uploadify组件上传文件

uploadify是和jQuery结合使用的异步上传组件,主要功能是批量上传文件,使用多线程来上传多个组件. 下载并导入js和样式文件 在正式学习uploadify组件之前,首先就是去官网下载最新的js和css等. http://www.uploadify.com/download/ 解压后如图:上面使用红色标示的文件是需要引入到项目中的.另外别忘了引入jquery.js文件 html页面以及上传条件的编写 <html> <head> <base href="<