項目中常常會遇到須要導出列表內容,或者下載文件之類的需求。結合各類狀況,我總結了前端最經常使用的三種方法來接受後端傳過來的文件流並下載,針對不一樣的狀況可使用不一樣的方法。前端
針對後端的get
請求ios
<a href="後端文件下載接口地址" >下載文件</a>
直接用個<a>
標籤來接受後端的文件流json
針對後端的post
請求
利用原生的XMLHttpRequest
方法實現axios
function request () { const req = new XMLHttpRequest(); req.open('POST', '<接口地址>', true); req.responseType = 'blob'; req.setRequestHeader('Content-Type', 'application/json'); req.onload = function() { const data = req.response; const a = document.createElement('a'); const blob = new Blob([data]); const blobUrl = window.URL.createObjectURL(blob); download(blobUrl) ; }; req.send('<請求參數:json字符串>'); }; function download(blobUrl) { const a = document.createElement('a'); a.style.display = 'none'; a.download = '<文件名>'; a.href = blobUrl; a.click(); document.body.removeChild(a); } request();
針對後端的post
請求
利用原生的fetch
方法實現後端
function request() { fetch('<接口地址>', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: '<請求參數:json字符串>', }) .then(res => res.blob()) .then(data => { let blobUrl = window.URL.createObjectURL(data); download(blobUrl); }); } function download(blobUrl) { const a = document.createElement('a'); a.style.display = 'none'; a.download = '<文件名>'; a.href = blobUrl; a.click(); document.body.removeChild(a); } request();
get
類型,能夠直接使用方法一,簡單又便捷;固然若是想使用方法2、三也是能夠的,不過感受有點捨近求遠了。post
類型,就必需要用方法二或者方法三了。XMLHttpRequest
實現的,這時方法二就更加適合,只要基於你原來項目中的接口請求工具類加以擴展就好了。fetch
實現的,這時方法三就更加適合,好比我如今的作的一個項目就是基於ant design pro
的後臺管理系統,它裏面的請求類就是基於fetch
的,因此我就直接用的方法三,只要在它的request.js
文件中稍做修改就行。