使用commons-fileupload的文件上传

一、JSP表单处理要点

get
get方法是浏览器默认传递参数的方法,敏感信息(eg:密码等)不建议使用get方法。
使用get时,传输数据的大小有限制 (注意不是参数的个数有限制),最大为1024字节。
post
敏感信息可以通过post方法传递,post提交数据是隐式的。
post提交数据是不可见的,而get是在url里面传递的。
JSP使用getParameter()来获得传递的参数,getInputStream()方法用来处理客户端的二进制数据流的请求。

二、jar包的准备

http://mirrors.hust.edu.cn/apache/commons/
下载commons-fileupload包和commons-io包
粘贴至/WebContent/WEB-INF/lib下

三、代码

(一)index.jsp

<body>
<form action="upload" method="post" enctype="multipart/form-data">
<input type="text" name="username"><hr>
<input type="file" name="upfile"><hr>
<input type="submit" value="提交">
</form>
</body>

(二)Upload.class

@WebServlet("/upload")
public class Upload extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("GBK");
        //检查当前表单是否以二进制流的形式上传
        boolean isMultipart=ServletFileUpload.isMultipartContent(request);
        if(isMultipart){
            //为文件创建工厂
            FileItemFactory factory=new DiskFileItemFactory();
            //创建一个新的文件上传处理
            ServletFileUpload upload=new ServletFileUpload(factory);
            //设置上传文件的最大size
            upload.setSizeMax(30*1024*1024);
            try {
                List<FileItem> items=upload.parseRequest(request);
                Iterator<FileItem> iter=items.iterator();
                while(iter.hasNext()){
                    FileItem item=iter.next();

                    //判断是否为表单域(文本框,单选,多选,下拉列表等)
                    if(item.isFormField()){
//                      System.out.println(item.getName());//文件名 此处获取不到
//                      System.out.println(item.getSize());//获取大小
//                      System.out.println(item.getContentType());//获取内容类型 此处获取不到
//                      System.out.println(item.getFieldName());//获取表单input的name
//                      System.out.println(item.getString());//获取文件内容 此处获取不到
                    }else{
//                      System.out.println(item.getName());//文件名
//                      System.out.println(item.getSize());//获取大小
//                      System.out.println(item.getContentType());//获取内容类型
//                      System.out.println(item.getFieldName());//获取表单input的name
//                      System.out.println(item.getString("GBK"));//获取文件内容
                        //获取当前工程相对路径(准备将上传的文件保存到这个路径下)
                        ServletContext application = this.getServletContext();
                        String realPath = application.getRealPath("/upfile");//upfile为创建在WebContent下的自定义文件夹
                        //根据浏览器的不同 item.getName()获取到的可能是文件名 也可能是路径+文件名 此处无差别处理一下
                        int index=item.getName().lastIndexOf(File.separator);//File.separator 动态获取分隔符
                        String filename=item.getName();
                        filename=filename.substring(filename.lastIndexOf(File.separator)+1);
                        try {
                            item.write(new File(realPath+File.separator+filename));
                        } catch (Exception e) {
                            request.getRequestDispatcher("fail.jsp").forward(request,response);
                        }
                        request.getRequestDispatcher("success.jsp").forward(request, response);;
                    }
                }
            } catch (FileUploadException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   
        }
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值