# Vue如何下载文件?
# 1、a标签url下载
exportUrl 是下载地址,点击之后直接在当前界面下载文件
<a :href="exportUrl" class="g-button simple">导出</a>
# 2、把地址传入浏览器地址中触发下载
window.open(exportUrl, '_self'); // 本窗口打开下载,地址栏的地址并不会改变
window.open(exportUrl, '_blank'); // 新开窗口下载
# 3、form表单提交下载
不需要我们处理返回二进制流直接下载,非常方便。
form的action设置为接口地址,method设置为post,Post到后台的数据设置为input的属性 name = key,value = value的形式,如果有多个key、value的值要传递,那么就设置多个input来分别储存单个的key、value;如果请求的接口可以不需要参数,那么input还是必须要一个,如果不要得话 会引起接口报错
原理:form的action相当于一个浏览器本页签/页面的一个请求,不会被后台,前台的路由拦截。所以能够提交成功。
注意点:如果设置method为get,在action中的uri添加了参数的话,想用这个参数替代input的key、value形式来提交到后台,这参数是没有效果的,后台拿不到这些参数,真正的参数还是以input的name、value的形式储存,在submit方法执行后传递到后台。
这样我们就是实现了文件下载,但是表单提交的数据一般是简单的键值对,如果传参比较复杂可以考虑将表单序列化(将多个key,value序列成json的格式)提交。
$.download = function (url, params, method) {
if (url && params) {
var inputs = '', input, form = $('<form>').attr("action", url).attr("method", (method || "post"));
$.each(params, function (k, v) {
input = $("<input type="hidden">");
input.attr("name", k).attr("value", v);
form.append(input);
});
form.appendTo('body').submit().remove();
}
};
使用方法:
var url = "/app/lottery/awards/export", params = { FILETYPE: "excel07", FRMID: that.FRMID };
$.download(url, params, "post");
# 4、HTML5的a标签download属性下载
标签的download是HTML5标准新增的属性,作用是指示浏览器下载URL而不是导航到URL,因此将提示用户将其保存为本地文件。
<a href="http://ww2.sinaimg.cn/large/4b4d632fgw1f1hhza4495j20ku0rsjxs.jpg" download>下载</a>
注意:此属性仅适用于同源 URL,跨域的资源无效。 尽管 HTTP URL 需要位于同一源中,但是可以使用 blob: URL 和 data: URL ,以方便用户下载使用 JavaScript 生成的内容(例如使用在线绘图 Web 应用程序创建的照片)。
# 跨域资源下载
// 下载一个文本文件
const downloadText = (text, filename = '') {
const a = document.createElement('a')
a.download = filename
// 文本txt类型
const blob = new Blob([text], {type: 'text/plain'})
// text指需要下载的文本或字符串内容
a.href = window.URL.createObjectURL(blob)
// 会生成一个类似blob:http://localhost:8080/d3958f5c-0777-0845-9dcf-2cb28783acaf 这样的URL字符串
document.body.appendChild(a)
a.click()
a.remove()
}