這次帶給大家ajax非同步下載檔案的實作方法,ajax異步下載檔案的注意事項有哪些,以下就是實戰案例,一起來看一下。
摘要: ajax請求一個二進位流(檔案),轉換為Blob進行處理或下載儲存檔案
需求
管理後台需要隨時下載資料報表,資料要即時產生後轉換為excel下載。
檔案不大,頁面放置「匯出」按鈕,點擊按鈕後彈出儲存檔案對話框儲存
說明:第一種方法使用a標籤直接可以滿足大部分人需求,第二種方法純粹是在說實現方法以及更好的操作體驗,不需要(舉一個需要第二種方法的例子:如果生成很慢就需要生成過程中禁用按鈕,防止連續生成)用到的可以不用看
解決方案
方法一
請求檔案的介面能改為GET則可以使用這種方法
<a class="btn btn-primary btn-xs" download="data.xlsx" href="download/?filename=aaa.txt" rel="external nofollow" ><i class="fa fa-share-square-o fa-lg"></i> 导出</a>
或變換一種方式,使用js動態建立a標籤
<button type="button" onclick="download()">导出</button> function download() { var a = document.createElement('a'); var url = 'download/?filename=aaa.txt'; var filename = 'data.xlsx'; a.href=url; a.download = filename; a.click() }
缺點
##不能使用post方法不能在啟動下載時停用按鈕、下載完成啟用按鈕#方法二
很多人都在說第一種方法可以滿足, 錯誤方式常規方法,使用jquery:<button type="button" onclick="download()">导出</button> function download() { var url = 'download/?filename=aaa.txt'; $.get(url, function (data) { console.log(typeof(data)) blob = new Blob([data]) var a = document.createElement('a'); a.download = 'data.xlsx'; a.href=window.URL.createObjectURL(blob) a.click() }) }這種方式保存的檔案是不能開啟的,console.log(typeof(data))會看到是string類型,原因是jquery將傳回的資料轉換為了string,不支援blob類型。
正確方式
<button type="button" onclick="download()">导出</button> function download() { var url = 'download/?filename=aaa.txt'; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); // 也可以使用POST方式,根据接口 xhr.responseType = "blob"; // 返回类型blob // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑 xhr.onload = function () { // 请求完成 if (this.status === 200) { // 返回200 var blob = this.response; var reader = new FileReader(); reader.readAsDataURL(blob); // 转换为base64,可以直接放入a表情href reader.onload = function (e) { // 转换完成,创建一个a标签用于下载 var a = document.createElement('a'); a.download = 'data.xlsx'; a.href = e.target.result; $("body").append(a); // 修复firefox中无法触发click a.click(); $(a).remove(); } } }; // 发送ajax请求 xhr.send() }
#相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章! 推薦閱讀:
以上是ajax異步下載檔案的實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!