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

前端下載后端返回的文件流,取請求頭中的文件名稱

這篇具有很好參考價值的文章主要介紹了前端下載后端返回的文件流,取請求頭中的文件名稱。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?一、先嘗試用普通方法調(diào)取后端接口



// 附件下載
export function downloadPdfs(data) {
  return request({
    url: '/organizaitonApproval/downloadWord',
    method: 'post',
    data: data,
    responseType: 'blob', // 需要加blob
  })
}

但是用上面的方法發(fā)現(xiàn)只能順利下載文件,res.headers["content-disposition"] 取不到后端給前端返回的請求頭。

通過問題排查發(fā)現(xiàn):

如圖,前端需要取的res.headersres.data 是一層的,當攔截器中返回res.data 后,就取不到外層的headers,因此前端要自己寫axios請求方法

前端下載后端返回的文件流,取請求頭中的文件名稱

二、前端單獨寫axios請求方法


import { getToken } from "@/utils/auth";
import axios from 'axios';
axios.defaults.headers['Authorization'] = 'Bearer ' + getToken();
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';

downloadFile(row) {
      let data={
        orgId: row.orgId
      }
      axios({
          method: 'post',
          url: '/organizaitonApproval/downloadWord',
          data: data,
          responseType: 'blob'
        }).then((res) => {
            // 文件流
            const content = res;
            const blob = new Blob([content]);
            let url = window.URL.createObjectURL(blob);
            let link = document.createElement("a");
            link.style.display = "none";
            link.href = url;

            // 取后端給前端返的請求頭中的文件名稱
            const temp =res.headers["content-disposition"].split(";")[1].split("filename=")[1];
            console.log("temp:" + temp)
    
            link.download = fileName
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link); //下載完成移除元素
            window.URL.revokeObjectURL(url); //釋放掉blob對象
      })
      .catch(error => {
        //console.log(error);
      });
    }

但是前端依舊拿不到 res.headers["content-disposition"] ,如圖,headers里面沒有content-disposition 屬性

前端下載后端返回的文件流,取請求頭中的文件名稱

繼續(xù)排查問題,發(fā)現(xiàn)后端沒有給前端單獨塞,需要找后端再改一下

三、后端需要給前端單獨塞一個 Content-Disposition


response.setHeader("Access-Control-Expose-Headers","Content-Disposition");

拿到res.headers["content-disposition"] 后,發(fā)現(xiàn)此時temp是亂碼,需要前端自己轉(zhuǎn)一下。

四、未經(jīng)過處理,直接拿到后端給前端的亂碼filename


%E8%BD%AF%E4%BB%B6%E9%A1%B9%E7%9B%AE%E8%AE%A1%E5%88%92%E8%A1%A8.docx

五、前端文件亂碼的轉(zhuǎn)碼方法

1、方法一:安裝iconv-lite依賴

(1)下載模塊包,使用npm install iconv-lite

(2)在項目中引入iconv-lite

import iconv from ‘iconv-lite’;


let iconv = require('iconv-lite'); 
iconv.skipDecodeWarning = true;//忽略警告
let buf = iconv.decode(temp, 'gdk');
const fileName = iconv.decode(buf, 'utf-8')
console.log('fileName_',fileName)

2、方法二:采用后端java在響應(yīng)頭中的里設(shè)置文件名稱(URLEncoder.encode)。前端vue,var fileName = decodeURIComponent(fileNameUtf8),進行解碼。

前端代碼如下:


downloadFile(row) {
      let data={
        orgId: row.orgId
      }
      axios({
          method: 'post',
          url: '/organizaitonApproval/downloadWord',
          data: data,
          responseType: 'blob'
        }).then((res) => {
        ? ? // 文件流
? ?         const content = res;
? ?         const blob = new Blob([content]);
? ?         let url = window.URL.createObjectURL(blob);
? ?         let link = document.createElement("a");
? ?         link.style.display = "none";
? ?         link.href = url;

? ? ? ? ? ? // 取后端給前端返的請求頭中的文件名稱
? ? ? ? ? ? const temp =res.headers["content-disposition"].split(";")[1].split("filename=")[1];
? ?         const fileName = decodeURIComponent(temp)
? ?         console.log("fileName:" + fileName)
? ? 
? ?         link.download = fileName
? ?         document.body.appendChild(link);
? ?         link.click();
? ?         document.body.removeChild(link); //下載完成移除元素
? ?         window.URL.revokeObjectURL(url); //釋放掉blob對象
      })
      .catch(error => {
        //console.log(error);
      });
    }

我采用的第二種方法

<** ----------2023-06-16 ---------- *>

【注:方法一的“安裝iconv-lite依賴”可能不行,今天想起來這個試了一下,發(fā)現(xiàn)依賴引入后,雖然解決了亂碼的問題,但是會導(dǎo)致通過原有攔截器的文件下載全部報錯,將該依賴卸載后,通過攔截器下載的文件恢復(fù)正常。所以最后還是得用方法二】

最后效果:

前端下載后端返回的文件流,取請求頭中的文件名稱

參考:解決前后端傳送文件名,出現(xiàn)亂碼問題,URLEncoder_urlencoder.encode 亂碼-CSDN博客

axios獲得文件流,轉(zhuǎn)為blob,出現(xiàn)部分文件亂碼問題解決思路_js請求后端的文件流轉(zhuǎn)為blob之后變了-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-429697.html

到了這里,關(guān)于前端下載后端返回的文件流,取請求頭中的文件名稱的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包