base64编码后的文件地址过长导致a标签失效
生活随笔
收集整理的這篇文章主要介紹了
base64编码后的文件地址过长导致a标签失效
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
做了一個Excel導出功能,因為要導出5W+條數據,剛開始是因為處理超時,就提高了nginx的超時時間
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
不超時了之后又內存溢出了,查了之后就加了運行內存
-Xms256m -Xmx1024m
好不容易數據傳到了前臺,卻發現沒反應,經過兩天時間的思考,寫下下面的內容。
如果使用base64作為a標簽的href值,可以用來接收較短的base64編碼后的數據源,但是當數據量較大時,會導致a標簽的click()事件失效.
我猜測是因為這個點擊事件是進行頁面跳轉的,所以herf作為URL時過長,超出了瀏覽器的限制。當數據小的時候可以正常跳轉進行下載
var url = "你的后臺請求url";var xhr = new XMLHttpRequest();xhr.open('post', url, true); // 也可以使用POST方式,根據接口xhr.setRequestHeader("Authorization", sessionStorage.getItem("sessionId"));xhr.responseType = "blob"; // 返回類型blobxhr.onload = function () {if (this.status === 200) {var blob = this.response;var reader = new FileReader();reader.readAsDataURL(blob); reader.onload = function (e) {// 轉換完成,創建一個a標簽用于下載var fileName = xhr.getResponseHeader("Content-Disposition").split(";")[1].split("filename=")[1]; //放在response header里的fileNamevar a = document.createElement('a');a.download = decodeURI(fileName); //文件名a.href = URL.createObjectURL(dataURLToBlob(e.target.result));$("body").append(a); // 修復firefox中無法觸發clicka.click();$(a).remove();}}};xhr.send(); function dataURLToBlob(dataurl) {var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);while(n--){u8arr[n] = bstr.charCodeAt(n);}return new Blob([u8arr], {type:mime}); }上面的代碼就是改了之后的,將base64轉為blob,再通過URL.createObjectURL()就可以賦值給a標簽了,記下來以備以后需要
總結
以上是生活随笔為你收集整理的base64编码后的文件地址过长导致a标签失效的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win2003安全警报--当前安全设置不
- 下一篇: 转行产品经理怎样才能少走弯路?新手必看!