国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java 實(shí)現(xiàn)文件下載】vue前端+java后端實(shí)現(xiàn)文件下載詳解(附源碼)

這篇具有很好參考價(jià)值的文章主要介紹了【Java 實(shí)現(xiàn)文件下載】vue前端+java后端實(shí)現(xiàn)文件下載詳解(附源碼)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

寫(xiě)在前面】前端時(shí)間總結(jié)了一下有關(guān)java文件上傳的功能,也給不少讀者帶來(lái)一些幫助,因此今天繼續(xù)完善文件下載這套體系,希望能給屏幕前的您帶來(lái)實(shí)質(zhì)性的幫助,其實(shí)文件下載最怕的就是中文亂碼的現(xiàn)象,當(dāng)然這個(gè)我單獨(dú)寫(xiě)了一篇文章解釋?zhuān)@里不做詳談。
涉及知識(shí)點(diǎn):encode和decode,java文件下載,文件下載中文名亂碼,F(xiàn)ileInputStream。

實(shí)現(xiàn)效果

【Java 實(shí)現(xiàn)文件下載】vue前端+java后端實(shí)現(xiàn)文件下載詳解(附源碼)

1、功能分析

首先我們要做的是下載,和導(dǎo)出還是有一點(diǎn)區(qū)別的,下載是從目標(biāo)路徑(服務(wù)器)將指定的文件下載一份下來(lái)到客戶(hù)端的過(guò)程。
所以首先我們必須得知道您要下載的文件存放路徑及對(duì)應(yīng)的文件名,這個(gè)可以是前端傳遞,也可以是在接口指定,當(dāng)然一些固定的模板可以采用接口指定或者配置文件設(shè)置,要是一些動(dòng)態(tài)的列表中下載指定的文件的話最好是前端傳遞。

Java中獲取當(dāng)前class路徑的方式如下(我是獲取之前上傳后文件的路徑,基于本地):

String tempName="黃大大的街舞夢(mèng).xlsx";
String filePath=this.getClass().getResource("/template/"+tempName).getPath();

網(wǎng)上還有人說(shuō)要根據(jù)不同瀏覽器的User-Agent屬性值來(lái)做判斷,但是我發(fā)現(xiàn)IE,Chrome,Edge都是可行的

2、代碼實(shí)現(xiàn)

Java實(shí)現(xiàn)文件下載我們要從前后端兩方面入手,且要確保目標(biāo)路徑下有你要的文件,不然也會(huì)下載失敗的。

2.1 前端頁(yè)面搭建(vue)

創(chuàng)建一個(gè)節(jié)點(diǎn),主要用于觸發(fā)文件下載接口,我用的是vant3的按鈕,基于click事件進(jìn)行觸發(fā),如下所示:

<van-button type="primary" @click="Download()">下載文件</van-button>

然后再在methods里面封裝一個(gè)下載的方法,如下所示:

Download() {
      axios
        .get("/Updown/download", { responseType: "blob" })
        .then((response) => {
          console.log(response);
          //headers請(qǐng)求頭的亂碼數(shù)據(jù)轉(zhuǎn)換為中文
          const fileName = decodeURI(
            response.headers["content-disposition"].split(";")[1].split("=")[1]
          );
          debugger;
          //下載文件
          let blob = new Blob([response.data], {
            type: "application/vnd.ms-excel",
          });
          let objectUrl = URL.createObjectURL(blob); // 創(chuàng)建URL
          const link = document.createElement("a");
          link.href = objectUrl;
          // link.download = '.xlsx'// 自定義文件名
          //這里是獲取后臺(tái)傳過(guò)來(lái)的文件名
          link.setAttribute("download", fileName);
          link.click(); // 下載文件
          URL.revokeObjectURL(objectUrl); // 釋放內(nèi)存
        })
        .catch((error) => {
          console.log(error);
          alert("下載失敗");
        });
    },

只有這個(gè)方法就可以實(shí)現(xiàn)下載功能

前端劃重點(diǎn)

請(qǐng)求方式:get的方式(post方式暫時(shí)沒(méi)有實(shí)測(cè),后續(xù)更新)
響應(yīng)類(lèi)型:responseType: “blob”,二進(jìn)制大對(duì)象類(lèi)型,存儲(chǔ)大量的二進(jìn)制和文本的容器。
編碼轉(zhuǎn)換:decodeURI,主要是和java的encode對(duì)應(yīng),因?yàn)橹形拿枰D(zhuǎn)一下,不然亂碼。

2.2 后臺(tái)接口實(shí)現(xiàn)(java)

Java下載文件其核心在于FileInputStream文件字節(jié)輸入流,也就是將文件變成機(jī)器識(shí)別的字節(jié),然后通過(guò)read方法,從文件的第一個(gè)字節(jié)開(kāi)始,read方法每執(zhí)行一次,就會(huì)將一個(gè)字節(jié)讀取,并返回該字節(jié)ASCII碼。
另外針對(duì)中文我們要加一個(gè)encode的編碼處理,方便傳輸不會(huì)出現(xiàn)中文名亂碼的現(xiàn)象。
Java實(shí)現(xiàn)核心代碼如下:

int len = filePath.lastIndexOf("/");
if (StringUtils.isBlank(filePath) || len == -1) {
    throw new Exception("未上傳文件!");
}
String fileName = filePath.substring(len + 1);
File file = new File(filePath);
if (!file.exists()) {
    throw new Exception("文件不存在!");
}
fileName = URLEncoder.encode(fileName, "UTF-8");
try {
    response.setHeader("Content-disposition","attachment; filename="+ fileName);
    response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding("UTF-8");
    OutputStream out = response.getOutputStream();
    BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file));
    try {
        byte[] content = new byte[1024];
        int length;
        while ((length = fin.read(content, 0, content.length)) != -1) {
            out.write(content, 0, length);
        }
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
        logger.info("文件下載失敗", e.getMessage());
        throw e;
    } finally {
        fin.close();
        out.flush();
        out.close();
    }
} catch (Exception e) {
    logger.error(e.getMessage(), e);
    throw e;
}

3、常見(jiàn)問(wèn)題

3.1 下載失敗

路徑問(wèn)題:首先確定路徑是對(duì)的,可以在后端打個(gè)斷點(diǎn)看filePath是否能在本地找到,不能找到肯定會(huì)導(dǎo)致失敗的。
請(qǐng)求方式問(wèn)題:請(qǐng)求方式是否前后端統(tǒng)一,別前端用了post后端用了get,這樣會(huì)導(dǎo)致接口調(diào)用失敗報(bào)錯(cuò)。

3.2 下載中文名亂碼、中文名下劃線、中文名百分號(hào)等現(xiàn)象。

編碼轉(zhuǎn)碼問(wèn)題:這個(gè)說(shuō)明接口通的,也能實(shí)現(xiàn)java文件下載了,但是中文名沒(méi)有進(jìn)行encode編碼和decode轉(zhuǎn)碼的步驟,所以這個(gè)時(shí)候應(yīng)該好好排查一下java的編碼和vue的轉(zhuǎn)碼。

4、皇榜彩蛋

傾心打造佳作,愿解君之惑,如若有幸,盼君上榜助陣,特此敬謝!
皇榜入口點(diǎn)擊此處
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-487399.html

到了這里,關(guān)于【Java 實(shí)現(xiàn)文件下載】vue前端+java后端實(shí)現(xiàn)文件下載詳解(附源碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 前端發(fā)送請(qǐng)求獲取后端文件,并且前端實(shí)現(xiàn)下載文件功能

    前端發(fā)送請(qǐng)求獲取后端文件,并且前端實(shí)現(xiàn)下載文件功能

    最近遇到一個(gè)需求,就是前端發(fā)送post請(qǐng)求獲取后端的excel文件,并且前端實(shí)現(xiàn)下載導(dǎo)出到本地的功能。 前端頁(yè)面就長(zhǎng)上面那樣,一個(gè)批量導(dǎo)出功能,用戶(hù)勾選之后,前端通過(guò)接口把id和其他的參數(shù)傳給后端,接口調(diào)用方法這里需要注意的是,這里必須設(shè)置responseType: ‘blob’

    2024年02月09日
    瀏覽(31)
  • Vue實(shí)戰(zhàn)【后端返回文件流時(shí),前端如何處理并成功下載流文件】

    Vue實(shí)戰(zhàn)【后端返回文件流時(shí),前端如何處理并成功下載流文件】

    哈嘍小伙伴們,在我們?nèi)粘9ぷ鳟?dāng)中,大家一定會(huì)遇到 文件導(dǎo)出 這樣的功能需求點(diǎn);導(dǎo)出功能前端后端都可以實(shí)現(xiàn),通常情況下呢是由我們后端同事去處理的,那么當(dāng)我們后端同事給你返回文件流的時(shí)候,前端要怎么處理并且完成下載呢?今天就給大家說(shuō)個(gè)簡(jiǎn)單的方法,我

    2024年02月11日
    瀏覽(22)
  • vue 中從后端獲取到文件的 url 地址,前端根據(jù) url 地址下載文件

    vue 中從后端獲取到文件的 url 地址,前端根據(jù) url 地址下載文件

    項(xiàng)目用的是 vben admin 框架,用的是 vue3 + TS 項(xiàng)目需求數(shù)據(jù)導(dǎo)出功能,前端需要實(shí)現(xiàn)文件下載功能 后端返回的是文件的 url 地址 (本項(xiàng)目中返回的是阿里云 oss 的文件地址) 從后端得到的是一個(gè) url 地址,先通過(guò) fetch api 請(qǐng)求這個(gè) url 地址并轉(zhuǎn)換成 blob 對(duì)象,通過(guò) URL.createObjectUrl() 將 blo

    2024年02月06日
    瀏覽(27)
  • java實(shí)現(xiàn)文件的上傳和下載,將文件流轉(zhuǎn)base64返回給前端

    上傳代碼 文件下載代碼 后端通過(guò)json拿到文件流的返回,我采用將文件流轉(zhuǎn)成base64返回給前臺(tái),實(shí)現(xiàn)代碼如下:

    2024年02月13日
    瀏覽(35)
  • vue 后端返回二進(jìn)制流-前端通過(guò)blob對(duì)象下載文件-圖片

    前言 在實(shí)際開(kāi)發(fā)中我們經(jīng)常會(huì)遇見(jiàn)下載文件的場(chǎng)景,比如下載合同,下載文件 下載文件有2種方式,一種是后端返回二進(jìn)制流,前端通過(guò)blob對(duì)象接受根據(jù)不同類(lèi)型下載 還有一種把地址直接在瀏覽器新窗口打開(kāi)瀏覽器打開(kāi)pdf可以預(yù)覽和下載,其他文件直接下載 但不管是那種方

    2024年02月05日
    瀏覽(24)
  • 后端:使用easyExcel實(shí)現(xiàn)解析Excel文件讀取數(shù)據(jù)。前端:Excel模板下載、前端上傳文件

    后端:使用easyExcel實(shí)現(xiàn)解析Excel文件讀取數(shù)據(jù)。前端:Excel模板下載、前端上傳文件

    ????????本篇是EasyExcel快速入門(mén)知識(shí),講解如何讀取Excel文件,對(duì)Excel中錯(cuò)誤信息如空字符、必填項(xiàng)為空、表格格式校驗(yàn)做到處理?,并給出了實(shí)際項(xiàng)目中示例代碼;為什么要使用easyexcel;原因是相比于poi,easyexcel更加輕量級(jí),讀取寫(xiě)入API方便,并且在工作中占用內(nèi)存較小;

    2024年02月05日
    瀏覽(37)
  • 前端實(shí)現(xiàn)文件下載的方法;以及后端返回 blob 文件流,進(jìn)行展示。

    前端下載一般分為兩種情況,一種是后端直接給一個(gè)文件地址,通過(guò)瀏覽器打開(kāi)就可以下載,另外一種則需要發(fā)送請(qǐng)求,后端返回二進(jìn)制流數(shù)據(jù),前端解析流數(shù)據(jù),生成URL,實(shí)現(xiàn)下載。 通過(guò)a標(biāo)簽的download屬性來(lái)實(shí)現(xiàn)文件下載,這種方式是最簡(jiǎn)單的,也是比較常用的方式,先來(lái)

    2024年02月06日
    瀏覽(27)
  • 后端返回文件流,前端怎么導(dǎo)出、下載(8種方法可實(shí)現(xiàn))

    在前端導(dǎo)出和下載后端返回的文件流時(shí),可以使用以下幾種方法: 使用 window.open() 方法: 在前端使用 window.open() 方法打開(kāi)一個(gè)新的窗口或標(biāo)簽頁(yè),并將后端返回的文件流作為URL傳遞給該方法。瀏覽器會(huì)自動(dòng)下載該文件。 例如: window.open(\\\'http://example.com/download\\\', \\\'_blank\\\'); 使用

    2024年02月11日
    瀏覽(27)
  • 【java】java實(shí)現(xiàn)大文件的分片上傳與下載(springboot+vue3)

    【java】java實(shí)現(xiàn)大文件的分片上傳與下載(springboot+vue3)

    源碼: https://gitee.com/gaode-8/big-file-upload 演示視頻 https://www.bilibili.com/video/BV1CA411f7np/?vd_source=1fe29350b37642fa583f709b9ae44b35 對(duì)于超大文件上傳我們可能遇到以下問(wèn)題 ? 大文件直接上傳,占用過(guò)多內(nèi)存,可能導(dǎo)致內(nèi)存溢出甚至系統(tǒng)崩潰 ? 受網(wǎng)絡(luò)環(huán)境影響,可能導(dǎo)致傳輸中斷,只能重

    2024年02月02日
    瀏覽(27)
  • java下載指定文件并返回給前端返回流文件

    java下載返回文件流的實(shí)現(xiàn) 作為一名經(jīng)驗(yàn)豐富的開(kāi)發(fā)者,我將教會(huì)你如何實(shí)現(xiàn)Java下載返回文件流的功能。在這篇文章中,我將分為以下幾個(gè)部分來(lái)詳細(xì)介紹這個(gè)過(guò)程: 1.簡(jiǎn)介 2.實(shí)現(xiàn)步驟 3.代碼示例 4.總結(jié) 在Java開(kāi)發(fā)中,有時(shí)候我們需要實(shí)現(xiàn)文件下載功能,并且將文件以流的形

    2024年03月15日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包