uniapp h5端使浏览器弹出下载框

如果只是zip文件,用方案一即可,创建节点标签<a>,执行点击行为即可触发下载框。

方案一

js 复制代码
	const imgUrl = "zip文件地址";
	
	//创建节点标签<a>,执行点击行为,拉原图
	const link = document.createElement('a');
	link.style.display = 'none';
	link.href = imgUrl;
	link.download = fileName;   // 这里不再受跨域限制
	document.body.appendChild(link);
	link.click(); //触发下载
	document.body.removeChild(link);
	// 释放内存
	setTimeout(() => URL.revokeObjectURL(imgUrl), 1000);

如果是图片资源,点击a标签可能会弹出图片预览窗口,解决思路是后端代理下载图片资源后,再在响应体修改Content-TypeContent-Disposition属性值,使浏览器识别为下载资源。

方案二

js 复制代码
async download() {
	// #ifdef H5
	const imgUrl = "图片文件地址";
	//获取文件名
	const fileName = imgUrl.split('/').pop().split('?')[0]; // 可选
	
	const proxyUrl = "URL化云对象方法地址"+`?url=${encodeURIComponent(imgUrl)}&filename=${encodeURIComponent(fileName)}`
				
	//创建节点标签<a>,执行点击行为,拉原图
	const link = document.createElement('a');
	link.style.display = 'none';
	link.href = proxyUrl;
	link.download = fileName;   // 这里不再受跨域限制
	document.body.appendChild(link);
	link.click(); //触发下载
	document.body.removeChild(link);
	// 释放内存
	setTimeout(() => URL.revokeObjectURL(proxyUrl), 1000);
	// #endif
}

云对象URL方法:

js 复制代码
	async download(params) {
		const { url: remoteUrl, filename = 'download.jpg' } = params;
		if (!remoteUrl) throw new Error('missing url');

		const safeName = filename.replace(/[^a-zA-Z0-9._-]/g, '_'); //转为符合格式的文件名

		// 1. 把远程文件拉回来,默认返回 Buffer
		const res = await uniCloud.httpclient.request(remoteUrl, {
		  method: 'GET',
		  timeout: 10000
		});
		//console.log('返回类型:', Object.prototype.toString.call(res.data));
		//console.log('字节长度:', res.data.length);
		
		// 2. 组装响应头,强制下载
		const headers = {
		  'Content-Type': 'application/octet-stream',
		  'Content-Disposition': `attachment; filename="${safeName}"`
		};
		
		// 3. 返回给前端
		return {
		  mpserverlessComposedResponse: true, //自定义响应必带参数
		  statusCode: 200,
		  headers,
		  body:res.data,
		  isBase64Encoded: true
		};
相关推荐
烬羽4 小时前
给 Agent 一个检索式记忆:把对话历史存进 Milvus,该记的都记得
javascript·数据库·agent
磐链科技4 小时前
区块链开发入门实战:用 Hardhat 与 Ethers.js 搭建你的第一个 DApp
开发语言·javascript·区块链
码艺-Alimjan4 小时前
维吾尔语数字转文本
java·javascript·python·算法·go
可乐鸡翅yeah_4 小时前
hls.js 多实例并发踩坑,多视频页面播放器内存与冲突问题解决
开发语言·前端·javascript·音视频·hls·m3u8·m3u8在线播放
涛涛ing4 小时前
你的页面为什么总是卡成PPT?2026年,90%的前端都忽略了主线程
前端
SoaringHeart4 小时前
Flutter 进阶 | 组件封装:用 CustomPainter 实现光环动画组件AnimatedHalo
前端·flutter
IT_陈寒4 小时前
JavaScript的隐式转换太坑了,我的==比较怎么就炸了?
前端·人工智能·后端
雪芽蓝域zzs4 小时前
第十四节:后端返回权限动态路由
前端·javascript·vue.js
小磊哥er5 小时前
Wonder Claude Code - 一个可运行的、教学级的 Claude Code 精简复刻
javascript·ai编程
Rain5095 小时前
谁动了我的 URL?——记一次微前端“灵异 Bug“的排查实录
前端·vue.js·人工智能·前端框架·bug·ai编程