文件下载

准备

  1. 要有一个form 标签,method=post 请求
  2. form 标签的encType 属性值必须为multipart/form-data 值
  3. 在form 标签中使用input type=file 添加上传的文件
  4. 编写服务器代码(Servlet 程序)接收,处理上传的数据。
  • encType=multipart/form-data 表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器

文件上传的 http协议说明

commons-fileupload.jar 常用API 介绍说明

  • commons-fileupload.jar 需要依赖commons-io.jar 这个包,所以两个包我们都要引入。
    • 第一步,就是需要导入两个jar 包:
      commons-fileupload-1.2.1.jar
      commons-io-1.4.jar
  • commons-fileupload.jar 和commons-io.jar 包中,我们常用的类有哪些?
  • ServletFileUpload 类,用于解析上传的数据。FileItem 类,表示每一个表单项。
    • boolean ServletFileUpload.isMultipartContent(HttpServletRequest request); 判断当前上传的数据格式是否是多段的格式。
    • public List parseRequest(HttpServletRequest request) 解析上传的数据
    • boolean FileItem.isFormField() 判断当前这个表单项,是否是普通的表单项。还是上传的文件类型。
      true 表示普通类型的表单项
      false 表示上传的文件类型
    • String FileItem.getFieldName() 获取表单项的name 属性值
    • String FileItem.getString() 获取当前表单项的值。
    • String FileItem.getName(); 获取上传的文件名
    • void FileItem.write( file ); 将上传的文件写到参数file 所指向抽硬盘位置。

代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$Title$</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/fileDownload" method="post"
      enctype="multipart/form-data">
    用户名:<input type="text" name="username"/> <br>
    头像:<input type="file" name="photo"> <br>
    <input type="submit" value="上传">
</form>
</body>
</html>
@WebServlet("/fileDownload")
public class FileDownloadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 先判断上传的数据是否多段数据(只有是多端的数据,才是文件上传的)
        if (ServletFileUpload.isMultipartContent(request)) {
            //创建 FileItemFactory 工厂实现类
            FileItemFactory fileItemFactory = new DiskFileItemFactory();
            //创建用于解析上传数据的工具类 ServletFileUpload
            ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
            try {
                //解析上传的数据,得到每一个表单项 FileItem
                List<FileItem> list = servletFileUpload.parseRequest(request);
                //循环判断,每一个表单是普通类型,还是上传的文件
                for (FileItem e : list) {
                    //判断是是否是字段属性
                    if (e.isFormField()) {
                        //普通比表单项
                        System.out.println("表单项的 name属性值" + e.getFieldName());
                        //参数 utf-8.解决乱码问题
                        System.out.println("表单项的 value属性值" + e.getString("utf-8"));
                    } else {
                        //上传文件
                        System.out.println("表单项的 name属性值" + e.getFieldName());
                        System.out.println("上传文件名" + e.getName());

                        //使用 uuid进行随机文件名
                        String fileName = UUID.randomUUID() +
                                //截取后缀
                                e.getName().substring(e.getName().lastIndexOf("."));
                        System.out.println(fileName);

                        //- 把服务器保存到硬盘中
//                        e.write(new File("D:\\新建文件夹\\" + fileName));

                        //- 把文件保存在项目的image文件夹中::::保存在idea配置的tomcat目录中
                        String path = request.getServletContext().getRealPath("/image");
                        System.out.println(path);
                        System.out.println(path + File.separator + fileName);

                        //- 使用这个FileItem 写入
                        e.write(new File(path));
                        //或者使用 apache.commons.io.IOUtils; 工具类写入
//                        IOUtils.copy(e.getInputStream(), new FileOutputStream(fileName));
                    }

                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
posted @ 2021-10-14 22:00  MikiKawai  阅读(36)  评论(0编辑  收藏  举报