刚开始我用的AJAX请求的后端,但是返回的数据流被解析成字符串,无法下载。
其实整个下载逻辑已经在后端进行判断,有无权限都由后端返回,所以前端就是一个请求而已。
layer.open
一个layer.open也是能实现下载,会一直显示加载状态,代码如下:
1 2 3 4 5 6 7 8 |
layer.open({ type: 2, title: '下载', shadeClose: true, shade: 0.8, area: ['80%', '70%'], content: '/index/management/certificate_download/id/' + data.id }); |
文件下载后这个窗口一直在转圈圈。
网上搜索资料后,给出了很多方法,ajax?blob?原生js?
但我觉得都很繁琐,和我的需求不符。
我当前已经在layui的表单中,已经有对应的数据传送到后端,只需要呈现后端反馈的结果即可。
所以直接打开新窗口不就可以了吗?
于是我这样写:
1 |
window.open('/index/management/certificate_download/id/' + data.id); |
能弹出窗口,能下载问题,问题看起来到这来结束了。
但实际上,我的开发需求是呈现后端返回,打开新窗口后脱离了layui,无法实现弹窗等操作,除非重新渲染页面。
故而,回到layui.open
加上窗口时间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
if (obj.event === 'download') { layer.confirm('是否下载该文件', function (index) { // 通过打开新窗口下载文件,但是不适用于后端反馈消息等情况 // window.open('/index/management/certificate_download/id/' + data.id); layer.open({ time: 100, type: 2, title: '下载', shadeClose: true, shade: 0.8, area: ['80%', '70%'], content: '/index/management/certificate_download/id/' + data.id }); layer.close(index); }); |
0.1秒内关闭打开的窗口,并且后端返回时,不返回到该窗口,返回到父级窗口,也就是对父级进行弹窗。
如此,既能实现下载,又能收到后端返回触发,并且还很简单。
原创文章,作者:蓝洛水深,如若转载,请注明出处:https://blog.lanluo.cn/10409