servlet下载文件

需求描述: 使用servlet在服务端下载文件

核心代码

package lhw.wanlin.content;

import sun.misc.BASE64Encoder;

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;
import java.net.URLEncoder;

@WebServlet(name = "EncodeServlet")
public class EncodeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }

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

        //获得要下载的文件的名称
        String filename = request.getParameter("filename"); //美女.jpg
        //解决获得中文参数的乱码
//        filename = new String(filename.getBytes("GBK"),"UTF-8");

        // 设置要下载的文件类型
        response.setContentType(this.getServletContext().getMimeType(filename));
        // 告诉浏览器不要解析次文件直接下载 ,没有这一行的话 浏览器会默认打开.后面的 java.net.URLEncoder.encode(filename, "UTF-8")是把文件名子编码,让浏览器下载的时候文件名不会乱码
        response.setHeader("content-disposition", "attachment;filename=" +  java.net.URLEncoder.encode(filename, "UTF-8"));
        //获取文件的绝对路径
        String path = this.getServletContext().getRealPath("download/" + filename);
        //获得该文件的输入流
        InputStream in = new FileInputStream(path);
        //获得输出流  通过response获得输出流,用于向客户端输出内容
        ServletOutputStream out = response.getOutputStream();
        //文件拷贝的模板代码
        int len = 0;
        byte[] buffer = new byte[1024];
        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
        in.close();
//        out.close();
    }
}

注意

  • 其实从服务器下载文件就是一个读取数据的过程,把文件读进缓存,再把文件写到客户端。
  • 有一部分文件浏览器会自动解析并打开,不会下载。这个时候需要加上response.setHeader("content-disposition", "attachment;filename=" + java.net.URLEncoder.encode(filename, "UTF-8"));告诉浏览器不要解析该文件,直接下载。没有这一行的话,浏览器会默认打开一部分类型的文件,不会下载
  • java.net.URLEncoder.encode(filename, "UTF-8")是为了解决中文文件名乱码的问题

前端的访问形式

servlet下载文件_第1张图片

web.xml配置

servlet下载文件_第2张图片

你可能感兴趣的:(Java)