最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java后端向前端返回文件流實(shí)現(xiàn)下載功能

 更新時(shí)間:2023年12月21日 14:34:30   作者:技術(shù)小羊  
后端可以使用Java中servlet提供的HttpServletResponse,核心步驟是要設(shè)置響應(yīng)的數(shù)據(jù)類型,設(shè)置為某一類文件類型或二進(jìn)制格式,以及響應(yīng)頭,然后用ServletOutputStream將文件以流的形式發(fā)送到前端,本文介紹Java后端向前端返回文件流實(shí)現(xiàn)下載功能,感興趣的朋友一起看看吧

前端實(shí)現(xiàn)文件下載功能有多種方法,這里就不一一介紹,這里只介紹使用文件流下載的實(shí)現(xiàn)方法。

既然是文件流那就肯定需要給前端返回一堆二進(jìn)制編碼,作為后端就可以返回一個(gè)OutPutStream

后端可以使用Java中servlet提供的HttpServletResponse,核心步驟是要設(shè)置響應(yīng)的數(shù)據(jù)類型,設(shè)置為某一類文件類型或二進(jìn)制格式,以及響應(yīng)頭,然后用ServletOutputStream將文件以流的形式發(fā)送到前端。

直接上代碼

response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=example.xls");

解釋一下

  • 首先設(shè)置響應(yīng)數(shù)據(jù)類型,你要下載什么文件就設(shè)置什么類型,如果你不知道文件是什么類型但可以肯定他不是文本文件,那就用下面的application/octet-stream表示,這樣瀏覽器就知道這是一些二進(jìn)制數(shù)據(jù),就不會(huì)對(duì)其解析了。

  • 其次是設(shè)置響應(yīng)頭:

其次是設(shè)置響應(yīng)頭:

attachment: 表示響應(yīng)內(nèi)容應(yīng)該被當(dāng)作附件處理,會(huì)觸發(fā)瀏覽器下載行為。

filename:參數(shù)指定下載文件的名稱。上述代碼則會(huì)讓瀏覽器下載一個(gè)example.xls的文件。

這里給大家放一個(gè)鏈接,里面有常見(jiàn)的MIME類型,常見(jiàn) MIME 類型列表 例如下圖,png類型,pdf,ppt等等。

然后就是用流的形式發(fā)送給前端

ServletOutputStream outputStream = response.getOutputStream();
checkInfo.write(outputStream);
outputStream.flush();

這樣后端就完成了把一個(gè)文件以文件流的形式傳遞給前端,前端發(fā)起請(qǐng)求就會(huì)觸發(fā)瀏覽器的下載行為。

下面是完整代碼

@GetMapping("/output/{classId}/{checkName}")
    public void checkToExcel(@PathVariable String checkName, @PathVariable String classId, HttpServletResponse response) {
        HSSFWorkbook checkInfo = checkExcelService.getCheckInfo(classId, checkName);
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + checkName + "簽到統(tǒng)計(jì)表.xls");
        try {
            ServletOutputStream outputStream = response.getOutputStream();
            checkInfo.write(outputStream);
            outputStream.flush();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

不知道有沒(méi)有朋友像我一樣,方法的返回值寫的是流(例如ByteArrayOutputStream)這么寫就錯(cuò)了

我之前在寫這個(gè)程序時(shí)就是向前端返回一個(gè)流,結(jié)果下載的文件始終格式錯(cuò)誤,瀏覽器收到的響應(yīng)數(shù)據(jù)類型也一直是json,原因就在于沒(méi)有使用response發(fā)送流,所以一定要使用response.getOutputStream()獲取流,然后再去flush,這樣前端才真正收到的是二進(jìn)制文件流。

到此這篇關(guān)于Java后端向前端返回文件流——實(shí)現(xiàn)下載功能!的文章就介紹到這了,更多相關(guān)Java后端向前端返回文件流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?SpringBoot操作Redis

    Java?SpringBoot操作Redis

    這篇文章主要介紹了SpringBoot如何操作Redis,文章中有詳細(xì)的代碼示例,有一定的參考價(jià)值,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • java線程池ThreadPoolExecutor的八種拒絕策略示例詳解

    java線程池ThreadPoolExecutor的八種拒絕策略示例詳解

    ThreadPoolExecutor是一個(gè)典型的緩存池化設(shè)計(jì)的產(chǎn)物,因?yàn)槌刈佑写笮?當(dāng)池子體積不夠承載時(shí),就涉及到拒絕策略。JDK中已預(yù)設(shè)了?4?種線程池拒絕策略,下面結(jié)合場(chǎng)景詳細(xì)聊聊這些策略的使用場(chǎng)景以及還能擴(kuò)展哪些拒絕策略
    2021-11-11
  • java開(kāi)發(fā)分布式服務(wù)框架Dubbo調(diào)用過(guò)程

    java開(kāi)發(fā)分布式服務(wù)框架Dubbo調(diào)用過(guò)程

    這篇文章主要為大家介紹了java開(kāi)發(fā)分布式服務(wù)框架Dubbo調(diào)用過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-11-11
  • Java代碼輕松實(shí)現(xiàn)將HTML轉(zhuǎn)成圖片

    Java代碼輕松實(shí)現(xiàn)將HTML轉(zhuǎn)成圖片

    HTML 轉(zhuǎn)圖片并非小眾場(chǎng)景,在實(shí)際開(kāi)發(fā)中相當(dāng)常見(jiàn),這篇文章就來(lái)和大家詳細(xì)介紹一下如何通過(guò)Java代碼輕松實(shí)現(xiàn)將HTML轉(zhuǎn)成圖片,感興趣的小伙伴可以了解下
    2026-04-04
  • Java通過(guò)JNI調(diào)用C++動(dòng)態(tài)庫(kù)的完整流程詳解

    Java通過(guò)JNI調(diào)用C++動(dòng)態(tài)庫(kù)的完整流程詳解

    JNI(Java Native Interface),是實(shí)現(xiàn)Java/Kotlin與C/C++語(yǔ)言之間交互的橋梁,本文主要為大家介紹了Java通過(guò)JNI調(diào)用C++動(dòng)態(tài)庫(kù)的完整流程,需要的可以參考下
    2025-04-04
  • Java中樹(shù)的存儲(chǔ)結(jié)構(gòu)實(shí)現(xiàn)示例代碼

    Java中樹(shù)的存儲(chǔ)結(jié)構(gòu)實(shí)現(xiàn)示例代碼

    本篇文章主要介紹了Java中樹(shù)的存儲(chǔ)結(jié)構(gòu)實(shí)現(xiàn)示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • servlet基礎(chǔ)知識(shí)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    servlet基礎(chǔ)知識(shí)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了servlet基礎(chǔ)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • SpringBoot整合ShardingSphere的示例代碼

    SpringBoot整合ShardingSphere的示例代碼

    本文主要介紹了SpringBoot整合ShardingSphere的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • SpringBoot基于攔截器與ThreadLocal實(shí)現(xiàn)用戶登錄校驗(yàn)

    SpringBoot基于攔截器與ThreadLocal實(shí)現(xiàn)用戶登錄校驗(yàn)

    本文介紹了一種在SpringBoot中實(shí)現(xiàn)統(tǒng)一登錄校驗(yàn)和上下文共享的解決方案,通過(guò)使用攔截器、ThreadLocal和自定義工具類,實(shí)現(xiàn)了在請(qǐng)求處理過(guò)程中優(yōu)雅地獲取當(dāng)前登錄用戶信息,并且避免了在每個(gè)Controller方法中重復(fù)編寫校驗(yàn)代碼,需要的朋友可以參考下
    2025-12-12
  • Java數(shù)據(jù)機(jī)構(gòu)中關(guān)于并查集的詳解

    Java數(shù)據(jù)機(jī)構(gòu)中關(guān)于并查集的詳解

    并查集是一種樹(shù)型的數(shù)據(jù)結(jié)構(gòu),用于處理一些不相交集合的合并及查詢問(wèn)題,如果你還不了解并查集,請(qǐng)看接下來(lái)的文章,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值
    2021-09-09

最新評(píng)論

通渭县| 竹北市| 扶沟县| 平安县| 钟山县| 长春市| 莆田市| 正宁县| 尼勒克县| 平果县| 房产| 抚顺市| 东乌珠穆沁旗| 同心县| 平顺县| 辽中县| 二连浩特市| 民权县| 尉氏县| 宁都县| 金山区| 西吉县| 徐闻县| 南皮县| 彰化县| 肇庆市| 金沙县| 建德市| 文化| 思南县| 张家口市| 华宁县| 中方县| 古交市| 涟源市| 朔州市| 余姚市| 深圳市| 岐山县| 明光市| 祥云县|