serlet文件的上传下载

文件的上传

  • 文件的上传(表单)
    1.表单提交方法:method="post"
    2.表单类型:enctype="multipart/form-data"
    3.表单元素类型 文件类型设置name属性
    <!--前端代码-->
    <form action="/three" method="post" enctype="multipart/form-data">
       请求参数:<input type="file" name="fileName"/><br/><br/>
      <input type="submit" value="文件上传"/>
    </form>
    
    
    //后端的servlet代码
    package com.test.controller;
    
    //servlet文件上传
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.MultipartConfig;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.Part;
      import java.io.IOException;
    
      /*
      * 如果表单的类型enctype="multipart/form-data",对应servlet一定加注解@Multipart
      * 如果没有加注解,所有参数都会为null
      * */
      @MultipartConfig
      public class uploadOfForm  extends HttpServlet {
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置编码格式
              req.setCharacterEncoding("utf-8");
              //文件上传
              //req.getPart(name);得到文件上传的对象,name代表的是file文件域的name属性值
              Part part = req.getPart("fileName");
              //得到文件名
              String submittedFileName = part.getSubmittedFileName();
              if(submittedFileName!=null && !submittedFileName.equals("")){
                  //设置文件的存放路径
                  String realPath = req.getServletContext().getRealPath("uploadFile");
                  //把传入的文件写入
                  part.write(realPath+submittedFileName);
              }
          }
      }
    
    
    

文件的下载

1.文件的下载(一、通过超链接的特性下载)

当我们在HTML或 JSP页面中使用a标签时,原意是希望能够进行跳转,但当超链接遇到浏览器不识另的资源
时会自动下载;当遇见浏览器能够直接显示的资源,浏览器就会默认显示出来,比如txt、png、jpg等。当然
我们也可以通过download 属性规定浏览器进行下载。但有些浏览器并不支持。
<!--当超链接遇到浏览器不能识别的资源时,会自动下载--> <a href="test.zip">超链接下载</a>
指定download属性下载
<!--当超链接遇到浏览器识别的资源时,默认不会下载。通过download属性可进行下载--> <a href="test.txt" download>
download属性可以不写任何信息,会自动使用默认文件名。如果设置了download属性的值,则使用设置的值做为文件名。当用户打开浏览器点击链接的时候就会直接下载文件。

2.文件的下载(二、后台实现下载)
实现步骤:

  • 要通过response.setContentType方法设置Content-type头字段的值,为浏览器无法使用某种方式或激活某个程序来处理的MIME类型,
    例如"application/octet-stream"或"application/x-msdownload"等。
  • 需要通过response.setHeader方法设置Content-Disposition头的值为"attachment,filename=文件名"
  • 读取下载文件,调用response.getOutputStream方法向客户端写入附件内容。
    代码的实现
    package com.test.controller;
    
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    public class download extends HttpServlet {
    
    //文件的下载
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取要下载的文件名
        String fileName = req.getParameter("fileName");
        //判断文件名是否为空
        if(fileName==null){
            System.out.println("请求文件名为空");
            return;
        }
        //要下载的文件路径
        String realPath = req.getServletContext().getRealPath("/uploadFile");
        //通过文件名在文件路径中获取对应文件
        System.out.println(realPath+fileName);
        File file =new File(realPath+fileName);
        if (file.exists()&&file.isFile()){
            //设置响应类型
            resp.setContentType("application/x-msdownload");
            //设置响应头
            resp.setHeader("Content-Disposition","attachment,filename="+fileName);
            //获取输入流
            FileInputStream fileInputStream = new FileInputStream(file);
            //获取输出流
            ServletOutputStream outputStream = resp.getOutputStream();
            //读取文件并把文件写入
            byte[] bytes = new byte[1024];
            int len =0;
            while ((len=fileInputStream.read(bytes))!=-1){
                outputStream.write(bytes,0,len);
                }
            outputStream.close();
            fileInputStream.close();
            }
        }
    }
    
posted @ 2021-01-29 14:51  8ling1ling  阅读(61)  评论(0)    收藏  举报