Response下载文件

HttpServletResponse

web服务器接接收到客户端的HTTP的请求,针对这个请求,分别创建一个代表请求的HttpServletResponse对象,代表响应的一个HttpServletResponse,

  1. 如果要获取客户端请求过来的参数:HttpServletRequest
  2. 如果要给客户端响应一些信息:HttpServletResponse

一、简单分类(查看源码:直接点击鼠标左键)

  1. 负责向浏览器发送数据的方法
   ServletOutputStream getOutputStream() throws IOException;
    PrintWriter getwriter() throws IOException;
  1. 负责向浏览器发送响应头的方法
    void setDateHeader(String var1, long var2);

    void addDateHeader(String var1, long var2);

    void setHeader(String var1, String var2);

    void addHeader(String var1, String var2);

    void setIntHeader(String var1, int var2);

    void addIntHeader(String var1, int var2);

    void setStatus(int var1);
  1. 响应状态码
点击查看代码
  int SC_CONTINUE = 100;
    int SC_SWITCHING_PROTOCOLS = 101;
    int SC_OK = 200;
    int SC_CREATED = 201;
    int SC_ACCEPTED = 202;
    int SC_NON_AUTHORITATIVE_INFORMATION = 203;
    int SC_NO_CONTENT = 204;
    int SC_RESET_CONTENT = 205;
    int SC_PARTIAL_CONTENT = 206;
    int SC_MULTIPLE_CHOICES = 300;
    int SC_MOVED_PERMANENTLY = 301;
    int SC_MOVED_TEMPORARILY = 302;
    int SC_FOUND = 302;
    int SC_SEE_OTHER = 303;
    int SC_NOT_MODIFIED = 304;
    int SC_USE_PROXY = 305;
    int SC_TEMPORARY_REDIRECT = 307;
    int SC_BAD_REQUEST = 400;
    int SC_UNAUTHORIZED = 401;
    int SC_PAYMENT_REQUIRED = 402;
    int SC_FORBIDDEN = 403;
    int SC_NOT_FOUND = 404;
    int SC_METHOD_NOT_ALLOWED = 405;
    int SC_NOT_ACCEPTABLE = 406;
    int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
    int SC_REQUEST_TIMEOUT = 408;
    int SC_CONFLICT = 409;
    int SC_GONE = 410;
    int SC_LENGTH_REQUIRED = 411;
    int SC_PRECONDITION_FAILED = 412;
    int SC_REQUEST_ENTITY_TOO_LARGE = 413;
    int SC_REQUEST_URI_TOO_LONG = 414;
    int SC_UNSUPPORTED_MEDIA_TYPE = 415;
    int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
    int SC_EXPECTATION_FAILED = 417;
    int SC_INTERNAL_SERVER_ERROR = 500;
    int SC_NOT_IMPLEMENTED = 501;
    int SC_BAD_GATEWAY = 502;
    int SC_SERVICE_UNAVAILABLE = 503;
    int SC_GATEWAY_TIMEOUT = 504;
    int SC_HTTP_VERSION_NOT_SUPPORTED = 505;

二、常见应用

  1. 向浏览器输出信息
  2. 下载文件
    1. 要获取下载文件的路径
      直接将图片复制,右键resource选择粘贴
      String realPath = this.getServletContext().getRealPath("/gem.jpg");//绝对路径
      不能放进照片的时候可以选择直接将照片存放在项目路径resource之下。
    2. 下载的文件名
    3. 设置想办法让浏览器支持我们要下载的东西
    4. 获取下载文件的输入流
    5. 创建缓冲区
    6. 获取output stream对象
    7. 将fileoutput stream流写入到缓冲区(buffer)
    8. 使用outputstream将缓冲区中的数据输出到客户端
    9. 配置web.xml
    10. 配置tomcat(有问题先刷新maven)
package com.xin.servlet;

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.FileInputStream;
import java.io.IOException;

public class FileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //获取需要下载文件的路径
       String realPath = "D:\\Program Files\\Java\\IdeaProjects\\javaweb-02-Servlet\\response\\target\\classes\\xi.jpg";//绝对路径
        System.out.println("下载文件的路径"+realPath);
        String filename = realPath.substring(realPath.lastIndexOf("\\") + 1);//+1表示最后一个路径
        //设置浏览器可以支持我们下载
        resp.setHeader("Content-Disposition","attachment;filename"+filename);
        //获取文件下载的输入流
        FileInputStream in = new FileInputStream(realPath);
        //创建缓冲区
        int len=0;
        byte[] buffer = new byte[1024];
        //获取outputstream对象
        ServletOutputStream out  = resp.getOutputStream();
        //将fileoutputstream流写入buffer缓冲区
        while ((len=in.read(buffer))>0){
            //使用outputstream将缓冲区中的数据输出到客户端
            out.write(buffer,0,len );
        }
        //关闭流
        in.close();
        out.close();

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

注意:

  1. 当用的是 String realPath = this.getServletContext().getRealPath("/gem.jpg");,会无法访问或者报错404
    可以用target/classes然后复制图片的绝对路径变成: String realPath = "D:\\Program Files\\Java\\IdeaProjects\\javaweb-02-Servlet\\response\\target\\classes\\xi.jpg";
  2. 控制台输出乱码是因为中文可以: resp.setContentType("text/html;charset=utf-8");
  3. 文件名是中文可以: resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(filename,"utf-8"));
  4. tomcat配置有问题及时刷新maven
  5. 注意web.xml配置,避免报错
posted @ 2025-09-02 15:02  xixixixin  阅读(13)  评论(0)    收藏  举报