第一种方法直接在前端使用超链接,也就是a标签
浏览器不能识别会直接下载(像压缩文件不能直接下载),浏览器能识别,想要下载加一个download属性。download可以不写任何信息。
首先在web下建一个文件,放需要下载的文件

前端代码:

<body>
<a href="download/8SR]W6{XY95QAENBX01XGBD.png">图片文件</a>
<a href="download/111.txt">文本文件</a>
<!--浏览器不能识别的文件-->
<a href="download/111.zip">压缩文件</a>
<hr>
<a href="download/8SR]W6{XY95QAENBX01XGBD.png" download="java.png">图片文件</a>
<a href="download/111.txt" download>文本文件</a>
</body>
</html> 
启动后点击页面中的超链接就可以下载。
第二种方式:后台实现下载
 
 1.  
 需要通过 
  response.setContentType  
 方法设置 
  Content-type  
 头字段的值, 为浏览器无法使用某  
 
 
 种方式或激活某个程序来处理的 
  MIME  
 类型,例 如 
  "application/octet-stream"  
 或 
  "application/x- 
 
 
 msdownload"  
 等。  
 
 
 2.  
 需要通过 
  response.setHeader  
 方法设置 
  Content-Disposition  
 头的值 为 
  "attachment;filename=  
 
 
 文件名 
 "  
 
 
 3.  
 读取下载文件,调用 
  response.getOutputStream  
 方法向客户端写入附件内容。 
 
 
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("-----文件下载-------");
        //设置请求的编码格式
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //获取参数(得到要下载的文件名,前端传来的)
        String fileName = request.getParameter("fileName");
        //参数的非空判断 trim();去除字符串的前后空格
        if(fileName == null || "".equals(fileName.trim())){
            response.getWriter().write("请输入要下载的文件名");
            response.getWriter().close();
            return;
        }
        //得到图片存放的路径
        String path = request.getServletContext().getRealPath("/download/");
        //通过路径得到file对象
        File file = new File(path + fileName);
        if(file.exists() && file.isFile()){
            //设置响应类型(浏览器无法使用某种方式或激活某个程序来处理MIME类型)
            response.setContentType("application/x-msdownload");
            //设置响应头
            response.setHeader("Content-Disposition","attachment;filename"+fileName);
            //得到file文件输入流
            InputStream in  = new FileInputStream(file);
            //得到字节输出流
            ServletOutputStream out = response.getOutputStream();
            //定义byte数组
            byte[] bytes = new byte[1024];
            //定义长度
            int len = 0;
            //循环输出
            while((len = in.read(bytes)) != -1){
                //输出
                out.write(bytes,0,len);
            }
            //关闭资源
            out.close();
            in.close();
        }else{
            response.getWriter().write("文件不存在,请重试!");
            response.getWriter().close();
        }
    }
} 
 ----------------------------------------------------------------
简化的代码
@WebServlet("/downloadServlet02")
public class DownLoadSimple extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置请求的编码
      request.setCharacterEncoding("UTF-8");
       // 获取文件下载路径
      String path = getServletContext().getRealPath("/");
       // 获取要下载的文件名
      String name = request.getParameter("fileName");
       // 通过路径得到file对象
      File file = new File(path + name);
      // 判断file对象是否存在,且是否是一个标准文件
      if (file.exists() && file.isFile()) {
      // 设置响应类型 (浏览器无法使用某种方式或激活某个程序来处理的类型)
      response.setContentType("application/x-msdownload");
      // 设置头信息
      response.setHeader("Content-Disposition", "attachment;filename=" + name);
      // 得到输入流
      InputStream is = new FileInputStream(file);
      // 得到输出流
      ServletOutputStream os = response.getOutputStream();
      // 定义byte数组
      byte[] car = new byte[1024];
      // 定义长度
      int len = 0;
      // 循环 输出
      while ((len = is.read(car)) != -1) {
      os.write(car, 0, len);
   }
     // 关闭流 释放资源
      os.close();
      is.close();
     } else {
         System.out.println("文件不存在,下载失败!");
     }
    }
} 
  



















