Springboot如何通過流返回文件
如何通過流返回文件
本人的文件是放在resource/templates目錄下,截圖如下
controller類如下
@GetMapping(value = "/downfile") public void download(HttpServletResponse response) throws IOException { String fileName = "template.xlsx"; // 設(shè)置信息給客戶端不解析 String type = new MimetypesFileTypeMap().getContentType(fileName); // 設(shè)置contenttype,即告訴客戶端所發(fā)送的數(shù)據(jù)屬于什么類型 response.setHeader("Content-type",type); // 設(shè)置編碼 String code = new String(fileName.getBytes("utf-8"), "iso-8859-1"); // 設(shè)置擴(kuò)展頭,當(dāng)Content-Type 的類型為要下載的類型時(shí) , 這個(gè)信息頭會(huì)告訴瀏覽器這個(gè)文件的名字和類型。 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如下
public class DownLoadUtils { public static void download(String filename, HttpServletResponse res) throws IOException { // 發(fā)送給客戶端的數(shù)據(jù) // 讀取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(); } }
注意點(diǎn)
response.addHeader("Content-Length",String.valueOf(file.length()));
如果不加這句代碼,下載下來(lái)的文件會(huì) 在打開前提示修復(fù),文件格式或文件擴(kuò)展名無(wú)效。請(qǐng)確定文件未損壞,并且文件擴(kuò)展名與文件的格式匹配
以流的方式直接返回
import java.io.FileReader; import java.io.InputStream; import java.util.Properties; /* */ public class Reflect { public static void main(String[] args) throws Exception{ //獲取一個(gè)文件的絕對(duì)路徑?。?! // 這種是先獲得絕對(duì)路徑然后在轉(zhuǎn)換成流。 // 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); } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
No ‘Access-Control-Allow-Origin‘ header is&nb
這篇文章主要介紹了No ‘Access-Control-Allow-Origin‘ header is present跨域及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02mybaties plus實(shí)體類設(shè)置typeHandler不生效的解決
這篇文章主要介紹了mybaties plus實(shí)體類設(shè)置typeHandler不生效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08Java構(gòu)造方法實(shí)例詳解(動(dòng)力節(jié)點(diǎn)java學(xué)院整理)
其實(shí)java構(gòu)造方法很簡(jiǎn)單,下面通過示例給大家分享java構(gòu)造方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-04-04SpringBoot中Zookeeper分布式鎖的原理和用法詳解
Zookeeper是一個(gè)分布式協(xié)調(diào)服務(wù),它提供了高可用、高性能、可擴(kuò)展的分布式鎖機(jī)制,SpringBoot是一個(gè)基于Spring框架的開發(fā)框架,它提供了對(duì)Zookeeper分布式鎖的集成支持,本文將介紹SpringBoot中的 Zookeeper分布式鎖的原理和使用方法,需要的朋友可以參考下2023-07-07通過實(shí)例了解Java Integer類和int的區(qū)別
這篇文章主要介紹了通過實(shí)例了解Java Integer類和int的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03