首页 > 其他分享 >response下载文件

response下载文件

时间:2023-01-06 23:24:12浏览次数:42  
标签:文件 String realPath resp 下载 servlet response png out

Servlet实现文件下载

一. servlet项目创建

1. 新建maven项目
  • 新建maven项目

    • 记得更换jdk版本
  • 项目设置

    • 在模块那添加web
  • 编译配置

    • 添加本地tomcat
  • 运行

    • 如果有创建index.jsp文件的话默认打开,没有的话会报错500,没资源
2. 添加servlet包
  • 配置pom.xml文件

    •     <dependencies>
              <dependency>
                  <groupId>javax.servlet</groupId>
                  <artifactId>javax.servlet-api</artifactId>
                  <version>4.0.1</version>
              </dependency>
          </dependencies>
      
    • <build>
          <resources>
              <resource>
                  <directory>src/main/resources</directory>
                  <includes>
                      <include>**/*.properties</include>
                      <include>**/*.xml</include>
                  </includes>
                  <filtering>true</filtering>
              </resource>
          </resources>
      </build>
      

记得关闭tomcat,不然依赖源不会实时更新,导入后长这样!

3. 新建java类
  • 拓展类,自动导包
package com.yorha.Servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ResponseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
    }

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

二. 资源路径的获取和使用

1. 获取下载路径
String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/路标.png");
2. 下载文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
3. 浏览器提供支持
resp.setHeader("Content-disposition","attachment;filename=" + URLEncoder.encode(fileName,"utf-8"));
4. 获取文件输入流
FileInputStream in = new FileInputStream(realPath);
5. 创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
6. 获取outputSteam对象
ServletOutputStream out = resp.getOutputStream();
7. 将fileOutputSteam写入缓冲区

使用OutputSteam将缓冲区内推输出到客户端

while ((len = in.read(buffer))>0){
    out.write(buffer,0,len);
}
8. 用完记得关闭文件,保证安全性
in.close();
out.close();
class类完整代码
//        1.    获取下载路径
        String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/路标.png");
//        2.   下载文件名
        System.out.println(realPath);
        String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
//        3.   浏览器提供支持
        resp.setHeader("Content-disposition","attachment;filename=" + URLEncoder.encode(fileName,"utf-8"));
//        4.   获取文件输入流
        FileInputStream in = new FileInputStream(realPath);
//        5.   创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
//        6.   获取outputSteam对象
        ServletOutputStream out = resp.getOutputStream();
//        7.   将fileOutputSteam写入缓冲区,使用OutputSteam将缓冲区内推输出到客户端
        while ((len = in.read(buffer))>0){
            out.write(buffer,0,len);
        }
        in.close();
        out.close();
注意事项

使用绝对路径时报错

ava.lang.NullPointerException: Cannot invoke "String.lastIndexOf(String)" because "realPath" is null

使用/加文件名

String realPath = this.getServletContext().getRealPath("/路标.png");

时得到的路径为

D:\javaweb\response\out\artifacts\response_Web_exploded\.png

这时点开输出的资源包里面发现是没有.png文件的,所以我们需要在pom.xml文件中添加如下代码

<include>**/*.png</include>

所选段完整代码如下

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                    <include>**/*.png</include>

                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

这时就能在WEB-INF文件中看到.png文件了

然后对照sout输出的内容修改路径

String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/路标.png");

此时就能正常下载了,这里注意是WEB"-"INF,不要写成WEB"_"INF,输入法按住shift是"-"是"__"

URLEncoder类
URLEncoder.encode(fileName,"utf-8")

标签:文件,String,realPath,resp,下载,servlet,response,png,out
From: https://www.cnblogs.com/yorha/p/17031857.html

相关文章

  • 【ABAQUS后处理】打印视口到文件
    abaquscae允许您在画布上打印一个或多个视口的快照,并将图像直接发送到打印机或文件以供以后使用,例如包含在嵌入打印报告的演示文稿中或以html格式显示document打印的......
  • 将xlsx列表文件转为md列表
    转换网站:https://tableconvert.com/在这篇文章中,我将告诉你如何快速的将Excel转换为markdown表格,以及如何将GoogleDocs,Numbers,网页中的表格或其他类似Excel的程序数据......
  • mathcad15安装教程附文件
    Mathcad15.0WIN1064位安装步骤:1、先使用“百度网盘客户端”下载Mathcad_15.0软件安装包到电脑磁盘根目录或英文路径文件夹下,并解压缩,安装前先关闭断开网络,然后数据打开“M......
  • 中国软件供应链安全分享报告 附下载地址
    声明本文是学习​​2021年中国软件供应链安全分析报告.下载地址http://github5.com/view/1216​​而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们......
  • 技术汇总:第十章:Maven Profile动态选择配置文件
    MavenProfile什么是MavenProfile在我们平常的java开发中,会经常使用到很多配制文件(xxx.properties,xxx.xml),而当我们在本地开发(dev),测试环境测试(test),线上生产使用(product)时,......
  • 文件上传相关内容
    解析漏洞:apache和nginx会存在解析漏洞,在一张正常图片里面加入php代码,上传该图片后,访问这个地址,会看到上传的图片,在后面加上/x.php,会出现乱码,但是可以执行php代码-------文......
  • 文件上传——WAF绕过
    上传参数名解析:明确哪些东西能更改content-disposition:一般可更改name:表单参数值,不能更改filename:文件名,可以更改content-type:文件MIME,视情况更改-------文件上传WA......
  • Gigabyte B450 Aorus Elite AMD Ryzen 5 3600电脑 Hackintosh 黑苹果efi引导文件
    硬件型号驱动情况主板GigabyteB450AorusElite处理器AMDRyzen53600已驱动内存16GBSamsungDDR31600MHz已驱动硬盘Samsung840Evo250GB已驱动显卡AMDRadeonRX570......
  • shell脚本将log文件格式化为markdown排版格式
    原文地址:https://www.cnblogs.com/liqinglucky/p/format2markdown.html通常日志文件往往有几十万行,导致查看日志很不方便。利用shell脚本识别日志文件中的关键词并给日志......
  • [记]python操作xml文件
    test.xml<A><AA><AAAname="aaa">AaA</AAA><BBB></BBB></AA><BB><CCCname="ccc">CcC</CCC><DDD></DDD></BB&g......