使用servlet实现文件上传(用common-fileUpload和common-io包)

来源:互联网 发布:知乎 bipolar disorder 编辑:程序博客网 时间:2024/06/08 16:11

http://blog.csdn.net/fatehj/article/details/51050437

用servlet实现文件的上传,这里用到Apache的开源工具:common-fileupload。因为common-fileupload依赖于common-io,所以需要同时下载两个包。 
这里写图片描述 
common-fileupload下载链接 
这里写图片描述 
commonm-io下载链接

  1. 把两个包相应的jar文件拷贝到项目的lib文件夹下: 
    这里写图片描述

  2. 创建文件上传表单:(fileUpload.jsp)

<body>        <form action="FileUploadServlet" method="post" enctype="multipart/form-data">            <input type="text" name="username"><br>            <input type="file" name="file"><br>            <input type="submit" value="文件上传">        </form>  </body>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

注意事项: 
这里文件上传表单中的method和enctype的设置属性是固定的,只能为post和multipart/form-data

<form action="XXXServlet" method="post" enctype="multipart/form-data">
  • 1
  • 1

3.servlet代码编写 
先建立一个upload文件夹 
这里写图片描述

代码:

public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        DiskFileItemFactory dfi = new DiskFileItemFactory();        //获得上传文件的存储路径        String path  = request.getRealPath("/upload");        //设置文件大小超过1024*1024就写到disk上        dfi.setSizeThreshold(1024*1024);        //设置存储的仓库        dfi.setRepository(new File(path));        //实例化一个servletFileUpload对象        ServletFileUpload sfu = new ServletFileUpload(dfi);        //解决上传文件乱码问题        sfu.setHeaderEncoding("utf-8");        try {            List<FileItem> list = sfu.parseRequest(request);            //取得session            HttpSession  session  = request.getSession();            //遍历得到每个FileItem            for(FileItem item : list){                //取得表单文本框的名字                String name = item.getFieldName();                //如果上传的这个文件只是一个表单字段,而不是一个文件                if(item.isFormField()){                    //取得文本框输入的内容                    String value = item.getString();                    //存储数据                    session.setAttribute(name, value);                }else{                    //如果上传的是一个文件                    //取得上传文件的名字,即上传框中的内容名字                    String value = item.getName();                    //因为在opera浏览器中文件上传item.geName()会得到具体路径而不止是名字,所以需要从路径中取出名字                    //取得文件路径名字开始的位置                    int start = value.lastIndexOf("\\");                    //得到文件名                    String fileName = value.substring(start+1);                    //读取文件的内容                    item.write(new File(path,fileName));                    //存储数据                    session.setAttribute(name, fileName);                }               }        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        //请求转发到另一个页面,在另一个页面取出上传文件的信息        request.getRequestDispatcher("fileInfo.jsp").forward(request, response);    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

注意问题: 
在这里的servlet中不能用request.getParameter("字段名")来获取表单的字段内容,因为表单的enctype="multipart/form-data",这里传输的是二进制,所以不能用`getParameter(“字段名”)获得。 
获得字段名:

String name = item.getFieldName();
  • 1
  • 1

获得内容:(分两种情况)

  1. 文本框内容:
String value = item.getString();//或者String value = item.getString("指定编码encoding")
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

2.文件上传:

    //取得上传文件的名字,即上传框中的内容名字        String value = item.getName();          //因为在opera浏览器中文件上传item.geName()会得到具体路径而不止是名字,所以需要从路径中取出名字    //取得文件路径名字开始的位置        int start = value.lastIndexOf("\\");    //得到文件名        String fileName = value.substring(start+1);    //读取文件的内容        item.write(new File(path,fileName));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
0

0 0