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

2 篇文章 0 订阅
1 篇文章 0 订阅

用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>

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

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

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

    }

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

String name = item.getFieldName();

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

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

2.文件上传:

    //取得上传文件的名字,即上传框中的内容名字
        String value = item.getName();      
    //因为在opera浏览器中文件上传item.geName()会得到具体路径而不止是名字,所以需要从路径中取出名字
    //取得文件路径名字开始的位置
        int start = value.lastIndexOf("\\");
    //得到文件名
        String fileName = value.substring(start+1);
    //读取文件的内容
        item.write(new File(path,fileName));
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值