2021-12-24 Servlet day6文件上传

一、介绍

  1. 要有一个form标签,method=post请求
  2. form标签的encType属性值必须为multipart/form-data
  3. 在form标签中使用input type=file添加上传的文件
  4. 编写服务器代码接受,处理上传的数据
<body>
    <form action="" method="post" enctype="multipart/form-data">
        用户名:<input type="text" name="username"/><br>
        头像:<input type="file" name="photo"> <br>
        <input type="submit" value="上传">

    </form>
</body>
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("文件上传过来了");
    }
}

二、文件上传时HTTP协议内容

2021-12-24 Servlet day6文件上传

2021-12-24 Servlet day6文件上传
表示提交的数据类型
multipart/form-data表示提交的数据,以多段(每个表单项一个数据段)的形式进行拼接,然后以二进制流形式进行拼接,然后以二进制流的形式发给服务器。
boundary表示每段数据分隔符

三、接收数据

public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //System.out.println("文件上传过来了");
        //客户端以流的形式接收
        ServletInputStream is = req.getInputStream();
        byte[] buffer=new byte[102400];
        int read=is.read(buffer);
        System.out.println(new String(buffer,0,read));
    }
}

此时收到的数据:
2021-12-24 Servlet day6文件上传
发现这些数据都已经发送到了服务器,接下来需要解析这部分的数据

四、上传需要用到的类和方法

调包侠——
commons-fileupload-1.2.1
commons-io-1.4

常用类:
ServletFileUpload类 用于解析上传的数据

public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //System.out.println("文件上传过来了");
        //客户端以流的形式接收
//        ServletInputStream is = req.getInputStream();
//        byte[] buffer=new byte[102400];
//        int read=is.read(buffer);
//        System.out.println(new String(buffer,0,read));
        //1.先判断上传的数据是否为多段数据(只有是多段的数据,才是文件上传的)
        if(ServletFileUpload.isMultipartContent(req))
        {
            //创建FileItemFactory工厂实现类
            FileItemFactory fileItemFactory=new DiskFileItemFactory();
            //创建用于解析上传数据的工具类ServletFileUpload类
            ServletFileUpload servletFileUpload=new ServletFileUpload(fileItemFactory);
            //解析上传的数据,得到每一个表单项FileItem
            try {
                List<FileItem> list=servletFileUpload.parseRequest(req);
                //循环判断,每一个表单项,是普通类型还是上传的文件
                for(FileItem f:list)
                {
                    if(f.isFormField())
                    {
                        //普通表单项
                        System.out.println("表单项name属性:"+f.getFieldName());
                        System.out.println("表单项value属性:"+f.getString("UTF-8"));
                    }
                    else
                    {
                        //上传的文件
                        System.out.println("表单项name属性:"+f.getFieldName());
                        System.out.println("上传的文件名:"+f.getName());
                        f.write(new File("c:\\"+f.getName()));
                    }
                }


            } catch (FileUploadException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

上一篇:Day6-Java 动态代理


下一篇:ES6,DAY6