前端下載后端返回的文件流


不借助外部插件的話,總結兩個方案:

1.使用blob

1 var elink = document.createElement('a');
2 elink.download = "成績導入結果.xls";
3 elink.style.display = 'none';
4 var blob = new Blob([data], {type: 'application/vnd.ms-excel'});
5 
6 elink.href = URL.createObjectURL(blob);
7 document.body.appendChild(elink);
8 elink.click();
9 document.body.removeChild(elink);

 

2.使用fileReader

 1 var blob = new Blob([data], {type: 'application/vnd.ms-excel'});
 2 var downFile = new FileReader()
 3 downFile.readAsDataURL(blob)
 4 downFile.onload = function (e) {
 5 var elink = document.createElement('a');
 6 elink.download = title+"-成績導入結果.xls";
 7 elink.style.display = 'none';
 8 elink.href = URL.createObjectURL(e);
 9 // elink.href = e.target.result
10 document.body.appendChild(elink);
11 elink.click();
12 document.body.removeChild(elink);
13 }

目前實踐的結果,第一種可以成功下載,第二種為進入ready,沒有下載。但是第一種下載的文件內容是亂碼的。

兼容寫法:

 1 function downLoadXls(data, filename) {
 2         //var blob = new Blob([data], {type: 'application/vnd.ms-excel'})接收的是blob,若接收的是文件流,需要轉化一下
 3     if (typeof window.chrome !== 'undefined') {
 4         // Chrome version
 5         var link = document.createElement('a');
 6         link.href = window.URL.createObjectURL(data);
 7         link.download = filename;
 8         link.click();
 9     } else if (typeof window.navigator.msSaveBlob !== 'undefined') {
10         // IE version
11         var blob = new Blob([data], { type: 'application/force-download' });
12         window.navigator.msSaveBlob(blob, filename);
13     } else {
14         // Firefox version
15         var file = new File([data], filename, { type: 'application/force-download' });
16         window.open(URL.createObjectURL(file));
17     }
18 }

 

亂碼考慮解決方案:

1.后端設置

2.responseType:'blob',{type: 'application/vnd.ms-excel'}等

調試把返回的data改成了上傳的文件流,發現下載下來沒有亂碼,因而考慮是接口返回的數據流格式不對或結構不對,流如下。

最終解決方法:

后端返回結果列表,前端進行生成和下載表格文件。

使用插件xlsjs。

關鍵算法:將數據轉化為二維矩陣數組結構,然后使用XLSX.utils.aoa_to_sheet將數組轉化為sheet表格,然后再轉化為blob數據,再使用上邊的方法進行下載即可。關鍵代碼如下:

 1 var xlsArr = []
 2                     data.data.forEach(function(e) {
 3                         xlsArr.push([e])
 4                     })
 5 downXls(sheet2blob(XLSX.utils.aoa_to_sheet(xlsArr), title+"-作業成績導入結果.xls"), title+"-作業成績導入結果.xls")
6 function sheet2blob(sheet, sheetName) { 7 sheetName = sheetName || 'sheet1'; 8 var workbook = { 9 SheetNames: [sheetName], 10 Sheets: {} 11 }; 12 workbook.Sheets[sheetName] = sheet; 13 // 生成excel的配置項 14 var wopts = { 15 bookType: 'xlsx', // 要生成的文件類型 16 bookSST: false, // 是否生成Shared String Table,官方解釋是,如果開啟生成速度會下降,但在低版本IOS設備上有更好的兼容性 17 type: 'binary' 18 }; 19 var wbout = XLSX.write(workbook, wopts); 20 var blob = new Blob([s2ab(wbout)], {type:"application/octet-stream"}); 21 // 字符串轉ArrayBuffer 22 function s2ab(s) { 23 var buf = new ArrayBuffer(s.length); 24 var view = new Uint8Array(buf); 25 for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; 26 return buf; 27 } 28 return blob; 29 }

sheet轉blob的邏輯,與后台生成表格文件流的邏輯是一致的,都是采用workbook生成文件流,然后前端生成可下載的url,再點擊觸發,即可下載文件。

我的git實例收藏地址:

https://github.com/MRlijiawei/components/blob/master/xlsJS/html.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM