jquery - 在不使用 Cookie 的情况下,使用 JQuery 下载带有加载器或进度表的 Excel 或其他二进制文件
问题描述
在不使用 cookie 的情况下使用 JQuery 下载 Excel 或其他二进制文件时,如何向用户显示“加载”小部件或进度表?
解决方案
$.ajax(url, {
xhrFields: {
responseType: 'arraybuffer'
},
success: function(data, textStatus, jqXHR) {
var blob = new Blob([data], {type: jqXHR.getResponseHeader('content-type')});
var fileName = jqXHR.getResponseHeader('content-disposition').split('filename=')[1].split(';')[0];
saveAs(blob, fileName);
},
progress: function(e) {
if (e.lengthComputable) {
const completedPercentage = Math.round((e.loaded * 100) / e.total);
if (completedPercentage >= 100) {
$("#loader").dialog("close");
}
}
else {
if (console) {
console.log('Content length not reported. Fix this server side.');
}
}
}
});
Fetch API 似乎是通过 ajax 提取二进制文件的更好方法,但不支持 IE,这对我来说是必需的。这是我查看的代码,以防它帮助任何人。我没有添加关闭“加载器”逻辑,但我很确定您可以在保存文件之前或之后执行此操作。
fetch(url, {
responseType: 'blob'
}).then(response => response.blob())
.then(blob => saveAs(blob, 'test.xlsx'));
这个答案是从网络和几个 SO 帖子拼凑而成的。相关链接见下文:
- https://stackoverflow.com/a/47197970/1048376(JQuery和通过 $.ajax() 下载二进制数据)
- https://stackoverflow.com/a/48437227/1048376(JQuery和通过 $.ajax() 下载二进制数据 - 我使用了这个解决方案)
- https://github.com/likerRr/jq-ajax-progress(轻量级 jQuery 插件,增加了对 $.ajax() 的进度和uploadProgress 承诺的支持 - 我使用了这个解决方案)
- http://www.dave-bond.com/blog/2010/01/JQuery-ajax-progress-HMTL5/ (你可以用这个代替上面的插件)
- https://github.com/eligrey/FileSaver.js(FileSaver 插件主页 - 我使用了这个解决方案)
- https://stackoverflow.com/a/25186103/1048376(使用 FileSaver)
- https://github.com/axios/axios(只是看了这个,没有尝试实现)https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API (比JQuery好但是不兼容 IE,所以不适合我)
- https://stackoverflow.com/a/62173022/1048376(如何从标题中获取文件名 - 我使用了这个解决方案)
- http://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/(fileDownload插件主页)
- https://stackoverflow.com/a/9970672/1048376(文件下载插件创建者 John Culviner 的优秀帖子。我使用这个插件已经很多年了,但是 Vericode 扫描迫使我全面使用 HttpOnly cookie(叹气).)
推荐阅读
- php - 循环表单输入
- flutter - 如何使用全局键设置文本字段值
- postgresql - 更新基于 jsonb 字段中的多个属性的 postgres jsonb
- react-native - React Native 视图被向上推,键盘弹出时高度动态变化
- ruby-on-rails - 即使安装了rails,heroku上的“bash:rails:找不到命令”
- javascript - 如何让它在 discord.js 上的嵌入消息中显示图片?
- django-rest-framework - “如何在 DRF 中添加“嵌套 URL,动态模型视图”
- python - 创建显示集合中所有可能的数字组合的算法
- pandas - 如何使用 pandas 数据框追加一列并删除一列?无法弄清楚为什么之后它不会打印数据框
- java - Android获取另一个应用程序的共享首选项