• 【JavaWeb】文件的上传和下载


    一.文件的上传介绍⭐️

    1.文件上传及HTTP协议的说明

    (1).要有一个form标签,method=post请求
    (2).form标签的encType属性值必须为multipart/form-data
    (3).在form标签中使用input type=file添加上传的文件
    (4).编写服务器代码接收(Servlet程序),处理上传数据

    public class UploadServlet extends HttpServlet {
    
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           // System.out.println("文件上传过来了");
            //System.out.println(req.getParameter("username"));//--null
            ServletInputStream inputStream = req.getInputStream();
            byte[] buffer = new byte[1024000];
            int read =  inputStream.read(buffer);
            System.out.println(new String(buffer,0,read));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
          <form action="http://localhost:8080/09_EL/uploadServlet" 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

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

    常用的类:

    • ServletFileUpload类,用于解析上传的数据.

    • FileItem类,表示每一个表单项

    常用方法:

    • (1).判断当前上传的数据格式是否是多段的格式.
    • boolean ServletFileUpload.isMultipartContent(HttpServletRequest request);
    • (2).解析上传的数据
    • public List parseRequest(HttpServletRequest request);
    • (3).判断当前这个表单项,是否是普通的表单项
    • true表示普通的表单项,false表示上传的文件类型
    • boolean FileItem.isFormField();
    • (4).获取表单项的name属性值
    • String FileItem.getFileldName();
    • (5).获取当前表单项的值
    • String FileItem.getString();
    • (6).获取上传的文件名
    • String FileItem.getName();
    • (7).将上传的文件写到参数file所指向的硬盘位置
    • void FileItem.write(file);
      protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            //1.判断上传的数据是否是多段数据(只有是多段的数据,才是文件上传的)
            if(ServletFileUpload.isMultipartContent(req)){
                //创建FileItemFactory工厂实现类
                FileItemFactory fileItemFactory = new DiskFileItemFactory();
                //创建用于解析上传数据的工具类 ServletFileUpload
                ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
                try {
                    //解析上传的数据,得到每一个表单项FileItem
                    List<FileItem> list = servletFileUpload.parseRequest(req);
                    //循环判断,每一个表单项,是普通类型,还是上传的文件
                    for(FileItem fileItem : list){
                        if(fileItem.isFormField()){
                            //普通表单项
                            System.out.println("表单项的name属性值: " + fileItem.getFieldName());
                            //参数UTF-8,解决乱码问题
                            System.out.println("表单项的value属性值: " + fileItem.getString("UTF-8"));
                        }else{
                            //上传的文件
                            System.out.println("表单项的name属性值: " + fileItem.getFieldName());
                            System.out.println("上传的文件名: " + fileItem.getName());
    
                            fileItem.write(new File("D:\\" + fileItem.getName()));
                        }
                    }
                } catch (FileUploadException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
        }
    
    • 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
    <body>
          <form action="http://localhost:8080/09_EL/uploadServlet" method="post" enctype="multipart/form-data">
              用户名: <input type="text" name="username" /></br>
              头像: <input type="file" name="photo" /></br>
              <input type="submit" value="上传" />
          </form>
    </body>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    二.文件下载⭐️

    在这里插入图片描述

     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1.获取要下载的文件名
            String downloadFileName = "pic-02.png";
            //2.读取要下载的文件内容(通过ServletContext对象可以读取)
            ServletContext servletContext = getServletContext();
            InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downloadFileName);
            //3.在回传前,通过响应头告诉客户端返回的数据类型
            //获取要下载的文件类型
            String mimeType = servletContext.getMimeType("/file/" + downloadFileName);
            System.out.println("下载的文件类型:" + mimeType);
            resp.setContentType(mimeType);
            //4.在回传前,通过响应头告诉客户端收到的数据是用于下载使用
            //Content-Disposition响应头,表示收到的数据怎么处理
            //attachment表示附件,表示下载使用
            //filename= 表示指定下载的文件名
            resp.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode("中国.png","UTF-8"));
            //resp.setHeader("Content-Disposition","attachment;filename=22.png");
            //5.把读取的文件内容回传给客户端
            //获取响应的输出流
            ServletOutputStream outputStream = resp.getOutputStream();
            //读取输入流中的全部数据,复制给输出流,输出给客户端
            IOUtils.copy(resourceAsStream,outputStream);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 相关阅读:
    深度学习服务器怎么选?哪个更划算?
    IDEA 构建web项目-详细教程
    工控自动化设备设计的专业知识
    OCI 发布了容器运行时和镜像规范!
    C++中的typeid运算符
    AcWing 827. 双链表
    python自动化标注工具+自定义目标P图替换+深度学习大模型(代码+教程+告别手动标注)
    安装银河麒麟桌面系统V10【超详细图文教程】
    spring cloud 使用oauth2 问题收集
    Polygon zkEVM R1CS与Plonk电路转换
  • 原文地址:https://blog.csdn.net/qq_53798578/article/details/127923894