企业项目管理、ORK、研发管理与敏捷开发工具平台

网站首页 > 精选文章 正文

Servlet文件下载是如何实现的?你看这篇就够了

wudianyun 2025-05-08 21:38:15 精选文章 13 ℃

其实文件下载,几乎在所有的网页中都有应用,实现方式都几乎一致,无非就是,找到文件的存储路径,然后获取文件输入流,然后利用文件输出流把文件输出出来。要想在网页中正确的输出文件,一定要注意响应头的设置,首先要告诉我输出的文件是什么类型?需要设置
Content-Type:application/octet-stream,其次要设置Content-Disposition:attachment;filename=xxx.docx。告诉浏览器你输出的名字是啥,只要听懂这几点,你下载可以闭眼写,这就是基本的Servlet下载核心。老铁们,如果你觉得该文章对你有用,请评论区留言,谢谢,以下是实现过程,请您笑纳。

HTML实现过程

<html>
<header>
    <meta charset="UTF-8"/>
    <meta content="text/html;charset=utf-8"/>
</header>
<body>
<a href="/download?filename=abc.docx">download</a>
</body>
</html>

Servlet实现过程

package com.kuang.servlet;

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.*;

@WebServlet("/download")
public class downloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) resp;
            response.setCharacterEncoding("UTF-8");
            String fileName = request.getParameter("filename");
            if (fileName.equals("")) {
                response.setContentType("text/html;charset=utf-8");
                response.setCharacterEncoding("UTF-8");
                response.getWriter().write("文件名不存在");
                response.getWriter().close();
                return;
            }
            String path = this.getServletContext().getRealPath("/download/");
            String filePath = path + fileName;
            File file = new File(filePath);
            if (file.exists() && file.isFile()) {
                response.setContentType("application/octet-stream");
                response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
                //获取输入流
                FileInputStream fileInputStream = new FileInputStream(file);
                //获取输出流
                ServletOutputStream fileOutputStream = response.getOutputStream();
                byte[] bytes = new byte[1024];
                int len = 0;
                while ((len = fileInputStream.read()) != -1) {
                    fileOutputStream.write(bytes, 0, len);
                }

                fileInputStream.close();
                fileOutputStream.close();

            } else {
                response.setContentType("text/html;charset=utf-8");
                response.setCharacterEncoding("UTF-8");
                response.getWriter().write("下载文件不存在或丢失");
                response.getWriter().close();
                return;
            }
        }catch (Exception ee){
            resp.setContentType("text/html;charset=utf-8");
            resp.setCharacterEncoding("UTF-8");
            resp.getWriter().write("异常"+ee.getMessage());
            ee.printStackTrace();
            resp.getWriter().close();
        }
    }

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

Maven配置

<dependencies>
    <!--Servlet 依赖-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
    <!--JSP依赖-->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.2.1</version>
      <scope>provided</scope>
    </dependency>
    <!--JSTL依赖-->
    <dependency>
      <groupId>javax.servlet.jsp.jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp.jstl</groupId>
      <artifactId>jstl-api</artifactId>
      <version>1.2</version>
    </dependency>

    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>
  </dependencies>

<build>
    <finalName>servlet-01</finalName>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
      </resource>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
      </resource>
    </resources>
</build>
最近发表
标签列表