<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
問了一下其他的後端,他們公司前端是a標籤,後端是給了一個地址,a標籤或者window.open()都可以實現。
我們公司是後端返回的二進位制流檔案,實現了一下,親測可以,沒有問題
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <button id="btn">下載</button> <!-- yarn add axios --> <script src="node_modules/axios/dist/axios.min.js"></script> <script> const btn = document.getElementById("btn"); btn.onclick = function () { axios({ method: "post", url: "http://localhost:3000/download", data: { // test: "test data", }, responseType: 'blob' //返回型別 }).then((res) => { let name = '合格率' //注意這裡不可以再加.xlsx了,函數中已經封裝了 createExcel(res.data, name) //這裡就直接這樣呼叫方法就行了 }); } // vue中可以寫方法 然後再暴露出去 function createExcel(res, name) { let blob = new Blob([res], { type: 'application/vnd.ms-excel' }) let fileName = name + '.xlsx' // 允許使用者在使用者端上儲存檔案 if (window.navigator.msSaveOrOpenBlob) { navigator.msSaveBlob(blob, fileName) } else { var link = document.createElement('a') link.href = window.URL.createObjectURL(blob) link.download = fileName link.click() //釋放記憶體 window.URL.revokeObjectURL(link.href) } } // 1.msSaveBlob:只提供一個儲存按鈕 //window.navigator.msSaveBlob(blobObject, 'msSaveBlob_testFile.txt'); // 2.msSaveOrOpenBlob:提供儲存和開啟按鈕 // window.navigator.msSaveOrOpenBlob(blobObject, 'msSaveBlobOrOpenBlob_testFile.txt'); </script> </html>
const http = require("http"); const fs = require("fs"); const server = http.createServer((req, res) => { if (req.url === "/download") { res.writeHead(200, { "Content-type": "application/vnd.ms-excel", // 返回 excel // 跨域設定 "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "content-type", }); // 非同步讀取檔案內容 這裡新建了一個test.xlsx的excel fs.readFile("test.xlsx", (err, data) => { // 返回二進位制檔案流 res.end(data); }); } }); server.listen(3000, () => { console.log("好厲害,3000的伺服器起來了"); });
<el-button type="warning" icon="el-icon-download" size="mini" @click="download()">匯出</el-button>
//下載操作 download() { return axios({ url: '/download/sms', method: 'post', data: this.queryForm, responseType: 'blob', headers: { 'Content-Type': 'application/json' } }) .then(res => { console.log(res, '返回資料列'); const blob = new Blob([res.data], { type: 'application/vnd.ms-excel' }); console.log(blob, '----------0990'); const fileName = '簡訊列表.xls'; const linkNode = document.createElement('a'); linkNode.download = fileName; //a標籤的download屬性規定下載檔案的名稱 linkNode.style.display = 'none'; linkNode.href = URL.createObjectURL(blob); //生成一個Blob URL document.body.appendChild(linkNode); linkNode.click(); //模擬在按鈕上的一次滑鼠單擊 URL.revokeObjectURL(linkNode.href); // 釋放URL 物件 document.body.removeChild(linkNode); }) .catch((err) => { console.log(err); }); return res; },
1、剛開始看網上說需要axios原生才能請求,然後就引入了axios之後但是一直報錯,導致download的then程式碼無法執行,直接走catch,輸出錯誤
研究了半天才發現是blob返回沒有code,也沒有message,而我在攔截器中直接設定了code的判斷攔截,所以導致請求一直報錯
2、在傳送請求時必須要加上responseType: ‘blob’,不然匯出的檔案是亂碼格式的
3、在then裡面定義的blob new出來的資料需要再走一層,而不是直接輸出
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45