背景介紹
后端是springboot框架,接口是restful風格接口,需求是異步實現一個文件下載,該文件是動態生成的,以流的方式返回給前端。存在的問題是,ajax不支持post方式傳參數,並觸發瀏覽器下載文件。經過多方調研,JavaScript原生XMLHttpRequest()對象可以實現。這里呈現主要的前端代碼,以供參考,具體請參考XMLHttpRequest()的API文檔介紹https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest。
實現代碼
1、實現函數方法
1 function download(options) { 2 var xhr = new XMLHttpRequest();//創建新的XHR對象 3 xhr.open(options.method, options.url);//指定獲取數據的方式和url地址 4 xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8') 5 xhr.responseType = 'blob';//以blob的形式接收數據,一般文件內容比較大 6 // 定義請求完成的處理函數,請求前也可以增加加載框/禁用下載按鈕邏輯 7 xhr.onload = function () { 8 // 請求完成 9 if (this.status === 200) { 10 // 請求成功 11 var blob = this.response; 12 var reader = new FileReader(); 13 reader.readAsDataURL(blob); // 轉換為base64,可以直接放入a表情href 14 reader.onload = function (e) { 15 // 轉換完成,創建一個a標簽用於下載 16 var a = document.createElement('a'); 17 a.download = 'backendCode.zip';//下載的文件名 18 a.href = e.target.result; 19 $("body").append(a); // 修復firefox中無法觸發click 20 a.click(); 21 $(a).remove(); 22 } 23 } 24 }; 25 xhr.send(options.data); //post請求傳的參數 26 }
2、參數設置
1 var options = { 2 url: '/geneCode', //下載地址 3 data: requestDataStr, //要發送的數據 4 method: 'post'//post方式發送數據 5 };
3、數據對象。
數據對象需要轉換成字符串類型,后端才可以反序列化,映射到指定的javabean。
1 var javaBean = { 2 author: “Eric” 3 } 4 var requestDataStr = JSON.stringify(javaBean);
結果
在觸發下載的函數中,引用該函數,即可實現post方式異步下載文件,觸發瀏覽器的文件下載過程。