好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Springboot如何通过流返回文件

如何通过流返回文件

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

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

查看更多关于Springboot如何通过流返回文件的详细内容...

  阅读:26次