JavaWeb-使用ServletContext下载文件

代码如下:

public class DownloadServlet extends HttpServlet {

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

        // 获取文件存放路径
        String filePath = this.getServletContext().getRealPath("/WEB-INF/classes/测试.txt");
        // 获取文件名称
        String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);

        // 创建文件对象
        File file = new File(filePath);
        // 创建文件输入流
        FileInputStream in = new FileInputStream(file);
        // 设置响应头部信息,使浏览器能识别并弹出下载框
        resp.setHeader("Content-Disposition",
                "attachment;fileName=" + URLEncoder.encode(fileName,"utf-8"));
        // 创建文件输出流
        ServletOutputStream out = resp.getOutputStream();
        // 将文件读进缓冲区,并从流中输出
        int len = 0;
        byte[] buffer = new byte[1024];
        while ((len = in.read(buffer))>0) {
            out.write(buffer,0,len);
        }
        // 关闭输入输出流
        in.close();
        out.close();
    }

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

web.xml 配置:

<servlet>
    <servlet-name>download</servlet-name>
    <servlet-class>com.study.servletcontext.DownloadServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>download</servlet-name>
    <url-pattern>/download</url-pattern>
  </servlet-mapping>

 问题记录:

代码写完后测试的时候发现下载的文件为空,改为图片测试后现实图片格式已损坏,开始以为是maven在构建的时候损坏了文件,但是查看了构建完成后target目录下的文件可以正常打开,尝试在pom.xml中配置之后依然没有解决。pom.xml修改的配置记录如下:在build标签下添加如下内容:

<resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <excludes>
          <exclude>*.txt</exclude>
          <exclude>*.png</exclude>
        </excludes>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>false</filtering>
        <includes>
          <include>*.txt</include>
          <include>*.png</include>
        </includes>
      </resource>
    </resources>

但是 并没有解决。仔细检查了自己的代码后发现,在输入输入流read的时候,没有把read的内容添加到缓存区,即刚开始的代码如下:

 int len = 0;
        byte[] buffer = new byte[1024];
        while ((len = in.read())>0) {
            out.write(buffer,0,len);
        }

read方法中没有添加buffer参数!!!

 

posted on 2021-05-26 16:12  曾经啊  阅读(72)  评论(0编辑  收藏  举报