服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Springboot如何通过流返回文件

Springboot如何通过流返回文件

2022-10-08 15:27一个想努力学技术的程序 Java教程

这篇文章主要介绍了Springboot如何通过流返回文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

如何通过流返回文件

本人的文件是放在resource/templates目录下,截图如下

Springboot如何通过流返回文件

controller类如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@GetMapping(value = "/downfile")
public void download(HttpServletResponse response) throws IOException {
    String fileName = "template.xlsx";
    // 设置信息给客户端不解析
    String type = new MimetypesFileTypeMap().getContentType(fileName);
    // 设置contenttype,即告诉客户端所发送的数据属于什么类型
    response.setHeader("Content-type",type);
    // 设置编码
    String code = new String(fileName.getBytes("utf-8"), "iso-8859-1");
    // 设置扩展头,当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。
    response.setHeader("Content-Disposition", "attachment;filename=" + code);
    response.setContentType("application/octet-stream;charset=ISO8859-1");
    response.addHeader("Pargam", "no-cache");
    response.addHeader("Cache-Control", "no-cache");
    DownLoadUtils.download(fileName, response);
}

工具类DownLoadUtils如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class DownLoadUtils {
    public static void download(String filename, HttpServletResponse res) throws IOException {
        // 发送给客户端的数据
        // 读取filename
        ClassPathResource classPathResource = new ClassPathResource("templates/"+filename);
        long length = classPathResource.getFile().length();
        res.addHeader("Content-Length",String.valueOf(length));
        OutputStream outputStream = res.getOutputStream();
        byte[] buff = new byte[1024];
        BufferedInputStream bis = null;
        InputStream inputStream =classPathResource.getInputStream();
        bis = new BufferedInputStream(inputStream);
        int i = bis.read(buff);
        while (i != -1) {
            outputStream.write(buff, 0, buff.length);
            outputStream.flush();
            i = bis.read(buff);
        }
        bis.close();
        outputStream.close();
    }
}

注意点

?
1
response.addHeader("Content-Length",String.valueOf(file.length()));

如果不加这句代码,下载下来的文件会 在打开前提示修复,文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配

以流的方式直接返回

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.FileReader;
import java.io.InputStream;
import java.util.Properties;
/*
 */
public class Reflect {
    public static void main(String[] args) throws Exception{
       //获取一个文件的绝对路径!!!
        // 这种是先获得绝对路径然后在转换成流。
//        String path = Thread.currentThread().getContextClassLoader()
//                .getResource("classinfo2.properties").getPath();
//        FileReader reader = new FileReader(path);
        //下面这种是直接用流的方式返回。
        InputStream reader = Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("classinfo2.properties");
        Properties pro = new Properties();
        pro.load(reader);
        reader.close();
        //通过key获取value。
        String className = pro.getProperty("className");
        System.out.println(className);
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。 

原文链接:https://blog.csdn.net/juanqiao7497/article/details/119357955

延伸 · 阅读

精彩推荐