JavaScript 下載流是指將服務器端的數據流通過前端的 JavaScript 代碼將文件下載到用戶的電腦或移動設備,具有非常廣泛的應用場景,比如使用 JavaScript 將 Excel 表格文件下載到本地,或者將圖片或 PDF 文件下載到設備中。在這篇文章中,我們將詳細介紹如何使用 JavaScript 下載流來實現文件下載功能。
在開始介紹如何使用 JavaScript 下載流之前,首先需要了解如何將一個二進制文件流轉換成實際的文件。我們可以使用 Blob 對象將二進制數據轉換為文件,如下所示:
// data 表示服務器返回的二進制數據 var blob = new Blob([data], { type: 'application/octet-stream' }); var url = window.URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = fileName; a.click(); window.URL.revokeObjectURL(url);
這段代碼中,我們首先使用 Blob 對象將二進制數據轉換為一種類似文件的對象,然后使用 URL.createObjectURL() 將 Blob 對象轉換為 URL 地址。接著,我們創建一個標簽并設置它的 href 屬性為轉換后的 URL 地址,設置 download 屬性為文件名,并將其通過 click() 方法觸發下載。最后,使用 window.URL.revokeObjectURL() 釋放 URL。
接下來,我們來看一些示例。首先,我們使用上述代碼實現一個將 Excel 文件下載到本地的函數,如下:
function downloadExcel() { fetch('/download/excel') .then(res =>res.arrayBuffer()) .then(buffer =>{ var blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); var url = window.URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'demo.xlsx'; // 文件名為 demo.xlsx a.click(); window.URL.revokeObjectURL(url); }); }
上面的代碼通過 fetch 獲取服務器端返回的 Excel 文件,然后將其轉換為 Blob 對象,并設置文件名為 demo.xlsx,最后進行下載。如果服務器端返回的不是二進制數據,我們還需要進行數據轉換。下面是一個將 JSON 數據轉換為 CSV 格式并下載到本地的示例:
function downloadCSV() { var data = [ { name: '張三', age: 18 }, { name: '李四', age: 20 }, { name: '王五', age: 22 } ]; var csv = '姓名,年齡\n'; data.forEach(row =>{ csv += row.name + ',' + row.age + '\n'; // 將每行數據轉換為 CSV 格式 }); var blob = new Blob([csv], { type: 'text/csv;charset=utf-8' }); var url = window.URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'demo.csv'; // 文件名為 demo.csv a.click(); window.URL.revokeObjectURL(url); }
上述代碼中,我們將數組數據轉換為 CSV 格式,并將其轉換為 Blob 對象,最后進行下載。可以看到,通過 JavaScript 下載流可以實現非常強大的文件下載功能,豐富了網頁的交互性和用戶體驗。