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

Java安全后端返回文件流方式

 更新時(shí)間:2023年07月28日 14:44:19   作者:Aimyone  
這篇文章主要介紹了Java安全后端返回文件流方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java安全后端返回文件流

起由

業(yè)務(wù)流程:上傳文件——服務(wù)器保存文件——根據(jù)路徑訪問文件

這種根據(jù)路徑定位文件,并對(duì)文件進(jìn)行查看的方式對(duì)文件安全有很大威脅,一旦知道其他文件的路徑,很有可能會(huì)造成文件泄露

改進(jìn)

所以,當(dāng)前端訪問文件的時(shí)候,發(fā)出請(qǐng)求并攜帶token,后端驗(yàn)證token,確認(rèn)為合法用戶之后,放行

根據(jù)請(qǐng)求路徑執(zhí)行后端的代碼(后端代碼邏輯:根據(jù)路徑讀取文件,輸出文件流,響應(yīng)給前端)

配置文件

配置上存文件的保存路徑

代碼

import org.apache.commons.io.IOUtils;
    @Value("${file.ectdreport-folder}")
    private String ectdReportFolder;
    @Transactional(rollbackFor = Exception.class)
    public void lookReport(String id, HttpServletResponse response) throws Exception {
        String url = ectdReportFolder + id + "/file1.html";
        File file = new File(url);
        if (!file.exists()) {
            throw new Exception("文件不存在");//拋出文件不存在的
        }
        response.setContentType("text/html");
        FileInputStream fis = null;
        OutputStream outputStream = response.getOutputStream();
        try {
            fis = new FileInputStream(file);
            //將讀取流拷貝到輸出流中
            IOUtils.copy(fis, outputStream);
            //清空緩存的讀取流,保證數(shù)據(jù)完整性
            response.flushBuffer();
        } catch (IOException e) {
            e.printStackTrace();
           throw new Exception("解析失敗");
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outputStream != null) {
                outputStream.close();//輸出流關(guān)閉
            }
        }
    }

后端返回文件流,前端怎么導(dǎo)出、下載

工作中肯定有很多導(dǎo)出excel、下載文件這種功能。一般都是后端做好,我們?nèi)フ?qǐng)求對(duì)應(yīng)的接口就行了,前端還需要做一些處理就可以實(shí)現(xiàn)導(dǎo)出、下載功能了。

第一步:在請(qǐng)求的時(shí)候做些一些處理

我們?cè)谡?qǐng)求的時(shí)候 需要定義responseType【響應(yīng)類型】為blob類型,如果是post請(qǐng)求還需要在請(qǐng)求頭里攜帶Content-Type: 'multipart/form-data'

  // 在請(qǐng)求的時(shí)候做一些處理
  // get請(qǐng)求
  markMownLoad = (id) => axios('get',`URLxxxxxx?fileId=${id}`,{
    responseType: 'blob',
    headers:{
      'Content-Type': 'multipart/form-data'
    }
  })
  // post請(qǐng)求
  markMownLoads = (id) => axios('post',`URLxxxxxx?fileId=${id}`,{
    responseType: 'blob',
    headers:{
      'Content-Type': 'multipart/form-data'
    }
  })

第二步:向后端發(fā)請(qǐng)求

在請(qǐng)求之前,我們先封裝一個(gè)解碼下載的一個(gè)方法,方便我們請(qǐng)求成功后調(diào)用

  function downLoadXls (res) {
    const fileNames = res.headers['content-disposition']
    if(fileNames) {
      //解碼
      const fileName = decodeURIComponent(fileNames.match(/=(.*)$/)[1])
      // 處理返回的文件流
      const content =res.data
      const blob = new Blob([content],{
        type: "application/octet-stream; charset=utf-8"
      });
      if('download' in document.createElement('a')) {
        //非IE下載
        const a = document.createElement('a') //創(chuàng)建一個(gè)a標(biāo)簽
        a.download = fileName //指定文件名稱
        a.style.display = 'none' //頁面隱藏
        a.href = URL.createObjectURL(blob) // href用于下載地址
        document.body.appendChild(a) //插到頁面上
        a.click() //通過點(diǎn)擊觸發(fā)
        URL.revokeObjectURL(a.href) //釋放URL 對(duì)象
        document.body.removeChild(a) //刪掉a標(biāo)簽
      }else{
        //IE10 + 下載
        navigator.msSaveBlob(blob,fileName)
      }
    }
  }

這個(gè)時(shí)候發(fā)請(qǐng)求就可以了

 // 發(fā)請(qǐng)求          把后端返回的傳過去解碼,然后實(shí)現(xiàn)導(dǎo)出、下載
  markMownLoads(參數(shù)).then(res => downLoadXls(res))

咱們來看一下后端返回的數(shù)據(jù)時(shí)什么樣子的

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用java?-jar命令啟動(dòng)Spring?Boot應(yīng)用時(shí)指定特定配置文件的幾種實(shí)現(xiàn)方式

    使用java?-jar命令啟動(dòng)Spring?Boot應(yīng)用時(shí)指定特定配置文件的幾種實(shí)現(xiàn)方式

    這篇文章主要介紹了在使用java-jar命令啟動(dòng)SpringBoot應(yīng)用時(shí),指定特定配置文件的幾種方式,文中通過代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2025-01-01
  • Java?8中?Stream小知識(shí)小技巧方法梳理

    Java?8中?Stream小知識(shí)小技巧方法梳理

    這篇文章主要介紹了Java8中Stream小知識(shí)小技巧方法梳理,Stream流和迭代器一樣,它只能夠迭代一次。當(dāng)它遍歷完的時(shí)候,我們就稱它已經(jīng)消費(fèi)完了。如果還想重新執(zhí)行操作,那么就只能從原來的地方再獲取一個(gè)流
    2022-09-09
  • IntelliJ IDEA基于Maven構(gòu)建Java項(xiàng)目

    IntelliJ IDEA基于Maven構(gòu)建Java項(xiàng)目

    在 Java 開發(fā)中,使用 Maven 是一種廣泛采用的構(gòu)建工具,本文主要介紹了IntelliJ IDEA基于Maven構(gòu)建Java項(xiàng)目,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Spring Boot啟動(dòng)及退出加載項(xiàng)的方法

    Spring Boot啟動(dòng)及退出加載項(xiàng)的方法

    這篇文章主要介紹了Spring Boot啟動(dòng)及退出加載項(xiàng)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringMVC中controller接收json數(shù)據(jù)的方法

    SpringMVC中controller接收json數(shù)據(jù)的方法

    這篇文章主要為大家詳細(xì)介紹了SpringMVC中controller接收json數(shù)據(jù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • SpringBoot整合Mail輕松實(shí)現(xiàn)郵件自動(dòng)推送功能

    SpringBoot整合Mail輕松實(shí)現(xiàn)郵件自動(dòng)推送功能

    在項(xiàng)目中經(jīng)常會(huì)遇到SpringBoot推送消息的業(yè)務(wù),除了站內(nèi)推送通知,郵件推送也是一種常見的方式,本文小編就給大家介紹了SpringBoot整合Mail輕松實(shí)現(xiàn)郵件自動(dòng)推送功能,需要的朋友可以參考下
    2024-12-12
  • Java反射機(jī)制實(shí)例代碼分享

    Java反射機(jī)制實(shí)例代碼分享

    這篇文章主要介紹了Java反射機(jī)制實(shí)例代碼分享,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java?SpringBoot?中的操作事務(wù)

    Java?SpringBoot?中的操作事務(wù)

    這篇文章主要介紹了Java?SpringBoot?中的操作事務(wù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Java繼承的問題引導(dǎo)和測(cè)試代碼

    Java繼承的問題引導(dǎo)和測(cè)試代碼

    這篇文章主要介紹了Java繼承的問題引導(dǎo)和測(cè)試代碼,涉及繼承的概念,合成的語法等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2021-08-08
  • 使用@Validated和@Valid 解決list校驗(yàn)的問題

    使用@Validated和@Valid 解決list校驗(yàn)的問題

    這篇文章主要介紹了使用@Validated和@Valid 解決list校驗(yàn)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論

县级市| 彩票| 巨野县| 慈利县| 象山县| 郎溪县| 承德市| 许昌市| 河北省| 盐津县| 平阳县| 读书| 特克斯县| 漾濞| 江阴市| 横峰县| 利川市| 双流县| 新河县| 阜平县| 铜鼓县| 长丰县| 泸水县| 阳西县| 茌平县| 肥东县| 秦皇岛市| 凉山| 瑞丽市| 宁安市| 伊宁市| 得荣县| 灵川县| 浦城县| 运城市| 盘山县| 湾仔区| 邵东县| 吴堡县| 左云县| 合川市|