Web不用跳白页,直接在当前页面下载文件

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

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

相关推荐
李日灐9 小时前
< 6 > Linux 自动化构建工具:makefile 详解 + 进度条实战小项目
linux·运维·服务器·后端·自动化·进度条·makefile
蝎子莱莱爱打怪9 小时前
小孩儿才做选择!Hermes 和OpenClaw 我都要!
人工智能·后端·github
直奔標竿9 小时前
SpringAI + RAG + MCP + Agent 零基础全栈实战(完结篇)| 27课完整汇总,Java开发者AI转型必看
java·开发语言·人工智能·spring boot·后端·spring
ai产品老杨9 小时前
深度解析:基于国产化异构计算的 AI 视频管理平台架构——从 GB28181 接入到 NPU 边缘推流的解耦实践
人工智能·架构·音视频
程序员鱼皮9 小时前
我用 DeepSeek V4 + Claude Code 开发了个「提肛助手」,这波给我爽麻了。。。
ai·程序员·编程·ai编程·deepseek
枫叶林FYL9 小时前
项目八 云资源成本优化与治理平台
后端·python·自然语言处理·flask
Bigger10 小时前
🧠 前端岗位的"结构性调整":现象背后的冷思考
前端·程序员·ai编程
梦想CAD控件10 小时前
网页CAD协同设计平台-生产级在线实时协同CAD引擎
前端·javascript·架构
SamDeepThinking10 小时前
第1篇-开篇词:几亿用户规模下,我们是怎么做C端高并发商品系统的
java·后端·架构
隔窗听雨眠10 小时前
从ZLibrary入口看数字资源分发架构
架构