如何通过流返回文件
本人的文件是放在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