欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

原生的servlet文件下载实现

程序员文章站 2022-06-02 13:53:43
...

文件下载是很多项目中比不可少的一个需求,下面用最原生的servlet来实现文件的下载功能。

记录一下实现的代码,方便以后忘记的时候再来温习一下~

package com.service;

import javax.servlet.ServletContext;
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.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

@WebServlet("/DownFile")
public class DownFile extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //    查找文件的路径
//    servletContext代表整个应用
        ServletContext servletContext = getServletContext();
        // 获取资源位文件在(服务器)磁盘目录
        String realPath = servletContext.getRealPath("img/上课时间安排.png");
        //截取文件名,为了客户下载资源的时候有一个文件名
        //File.separator表示/,不同操作系统不一样
        String fileName = realPath.substring(realPath.lastIndexOf(File.separator) + 1);
        //有的时候从服务器上下在一个带有中文的文件的话,就会出现乱码,需要解决乱码问题
        fileName= URLEncoder.encode(fileName,"utf-8");

        //将其读入到输入流中
        FileInputStream fileInputStream = new FileInputStream(realPath);

        //服务器要告诉浏览器需要下载资源问价了
        resp.setHeader("content-disposition", "attachment;filename=" + fileName);

        //设置下载的文件夹,就是截取文件后缀名
        String mimeType = servletContext.getMimeType(fileName);

        resp.setContentType(mimeType);

        //通过输出流给客户端
        ServletOutputStream outputStream = resp.getOutputStream();
        byte[] temp = new byte[1024];
        int len = 0;
        while ((len = fileInputStream.read(temp)) != -1) {
            outputStream.write(temp, 0, len);
            outputStream.flush();
        }
    }


}

测试:下载部署在tomcat下面的javaWeb项目下面的background.jpg图片
原生的servlet文件下载实现

servlet3.0以下的需要加入下面的映射

<servlet>
        <servlet-name>DownFile</servlet-name>
        <servlet-class>com.service.DownFile</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DownFile</servlet-name>
        <url-pattern>/DownFile</url-pattern>
    </servlet-mapping>

运行结果:
原生的servlet文件下载实现
成功!!!!