关注我的公众号:【编程朝花夕拾】,可获取首发内容。

01 引言
在业务开发中,我们会经常遇到文件的上传下载,文件上传已经被玩烂了,各种插件和工具。但还是文件的下载总是被忽略,可能简单一行代码:
js
window.open("/download");
这样的固然可以解决下载问题,但是会短暂的出现一个白页,体验感总是不好。功能实现了,我们也不会去多想,毕竟作为一个纯后端的开发,对于前端的细节也不讲究,以功能为准。
02 契机
这两台天恰好做了一个上传、下载的功能:

开始做的时候,就按照最简单的方式(window.open("/file/downloadFile")
)做了,但是当文件较大时,就会出现长时间的白页问题,体验感很差。如图:

恰好有时间,就想研究一下,怎么不跳转页面直接等待文件下载呢?
想到邮件中的附件下载,就是在当前页面下载的。就去看了看页面元素,发现直接使用了a
标签实现的,于是就启动了自己的改造运动。
03 改造运动
3.1 启用a
标签
html
<a href="/file/downloadFile">a标签下载</a>

看其他技术文章,需要a
标签的download
属性,download
属性可以指定下载的文件名称。我这里没有指定。
但是,我们项目中用的按钮是button
标签,无法直接使用a
标签。
3.2 包装a
标签
有这两种解决方案:
- 使用隐藏域,将
a
标签隐藏起来, - 创建临时标签
伪代码
js
$("button").click(function() {
// 触发a标签的点击事件
$("a").click();
});
这里以创建临时标签为例:
js
$("<a href='/file/downloadFile'></a>").click();
翻车了
然并卵,根本不生效。查了资料表示,浏览器为了防止自动下载,禁用了download
,但是明明刚才可以用的。
修正
经过一些案例测试,发现Jquery
无法触发a
标签的点击事件。只能通过DOM
节点触发。那就将Jquery
转成DOM
对象不就好了。
js
$("<a href='/file/downloadFile'></a>")[0].click();

04 思考
其实案例的下载就是发起一个请求,那么还可以通过什么方式发起类似href
这样的请求呢。
<img src=''>
<form action=''>
我替大家试过了:img
标签不行的,而form
标签没有问题。
js
let $form = $("<form action='/file/downloadFile'></form>");
$(document.body).append($form);
$form.submit();
$form.remove();
这里需要注意的是:form
已经到加到body
里面,否则就会出现下面的异常:
Form submission canceled because the form is not connected