Servlet文件下载

2017-11-20 15:25:56

    前文学了response有两个输出的方式,分别是

    response.getWriter();//输出字节码文件的

    response.getOutputStream();//输出二进制文件的


    而读取文件,我们需要new一个FileInputStream

    首先建立一个DownServlet文件,相关代码如下:

package com.nosay.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

@WebServlet(name = "DownloadlServlet",urlPatterns = "/download")
public class DownloadlServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String filename = request.getParameter("filename");
        String realPath = this.getServletContext().getRealPath("download/" + filename);
        InputStream in = new FileInputStream(realPath);
        ServletOutputStream outputStream = response.getOutputStream();

        //文件拷贝 
        int len = 0;
        byte[] buffer = new byte[1024];
        while ((len=in.read(buffer)) > 0)
        {
            outputStream.write(buffer,0,len);
        }
        in.close();
    }
}

    此时我们在根目录建立一个download文件夹,在里面建立aa.txt文本文件,内容为hello

    然后访问一下http://localhost:8080/download?filename=aa.txt

    此链接

    成功得到了aa.txt中的内容,hello

    如何不在浏览器中查看,而是直接下载此txt文件呢?

    此时我们需要一个响应头来通知浏览器直接下载

    1.通过文件输入输出流将文件返回给客户端浏览器.

    2.通过对应的http响应头通知浏览器下载该文件.

    告知浏览器文件的类型:response.setContentType(文件的MIME)类型

    告知浏览器文件的打开方式是下载

    response.setHeader("Content-Disposition","attachment;filename=文件名称")

     

    相关代码 

package com.nosay.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

@WebServlet(name = "DownloadlServlet",urlPatterns = "/download")
public class DownloadlServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String filename = request.getParameter("filename");
        String mimeType = this.getServletContext().getMimeType(filename);
        response.setContentType(mimeType);
        response.setHeader("Content-Disposition","attachment;filename="+filename);
        String realPath = this.getServletContext().getRealPath("download/" + filename);
        InputStream in = new FileInputStream(realPath);
        ServletOutputStream outputStream = response.getOutputStream();

        //文件拷贝 
        int len = 0;
        byte[] buffer = new byte[1024];
        while ((len=in.read(buffer)) > 0)
        {
            outputStream.write(buffer,0,len);
        }
        in.close();
    }
}