【js】js根据url或数据下载文件到本地

这篇博客主要介绍了如何解决苹果浏览器无法通过`window.location.href`直接下载文件的问题。提供了一种前端解决方案,包括两种方法:一是直接使用后台返回的文件数据进行下载;二是后台仅返回URL时,通过XMLHttpRequest获取文件数据后再下载。此外,还分享了常见文件格式的相关链接。

以前都是直接用windows.location.href 然后标签添加个download就可以,

后来发现苹果浏览器这样不能下载,反而在浏览器中把文件直接给打开了。

解决方法如下

(1)如果是后台返回了文件的数据,则前台文件中直接引入这个js,然后直接调用下面的方法就可以了。js下载地址点这里,分别是数据,文件名,文件格式,常见文件格式看本文最后

download(data, strFileName, strMimeType);

(2)如果是后台只返回了一个url,那么也是先引用刚刚下载的js,然后用下面代码获取到data并下载。即

// 下载含有url的文件
function downloadUrlFile(url, fileName) {
	const url2 = url.replace(/\\/g, '/');
	const xhr = new XMLHttpRequest();
	xhr.open('GET', url2, true);
	xhr.responseType = 'blob';
	//如果希望文件名就是url斜杠最后的部分,则加上下面两行代码,fileName参数传url就行
	//var index = fileName .lastIndexOf("\/");
	//fileName  = fileName .substring(index + 1, fileName .length);
	// 为了避免大文件影响用户体验,建议加loading
	xhr.onload = () => {
		if (xhr.status === 200) {
			// 获取文件blob数据并保存
			download(xhr.response, fileName, "text/csv" );
		}
	};
	xhr.send();
}

(3)常见的文件格式我在其他博主的博文中看到了

https://blog.youkuaiyun.com/zhuyu19911016520/article/details/88714289

<think>我们被要求根据提供的多个引用信息,总结如何使用JavaScript通过URL实现文件下载功能。引用[1]和引用[5]展示了通过创建a标签并设置download属性来触发下载。引用[2]和引用[3]提到通过XMLHttpRequestfetch请求文件数据(作为blob),然后利用URL.createObjectURL创建临时链接进行下载。引用[4]同样使用了Blob和URL.createObjectURL方法。因此,我们可以总结两种常见方法:方法1:直接使用a标签(适用于已知文件URL且同源的情况)方法2:通过AJAX获取文件数据(blob),然后创建临时链接(适用于需要处理跨域需要设置请求头等情况,但跨域受CORS限制)根据用户的问题,他想要“根据URL地址下载附件”,这个URL可能是同源也可能是跨域。但注意,跨域下载需要服务器设置CORS响应头(特别是Access-Control-Allow-Origin),否则无法读取资源。下面我们分别给出两种方法的代码示例,并解释。方法1:直接创建a标签(简单,但需要同源,者目标资源允许被直接下载)方法2:使用fetch(XMLHttpRequest)获取blob,然后创建临时链接(可以处理一些复杂情况,但同样受到跨域限制)同时要注意,引用[5]提供了一个使用a标签的封装函数downfile。我们将参考这些引用,编写代码。注意:引用[3]展示了一个使用axios(封装了XMLHttpRequest)的示例,但这里我们使用原生fetch。另外,引用[2]提到了window.open,但这种方法会打开新窗口而不是下载,一般不建议。代码示例:方法1:直接创建a标签(适用于同源服务器配置了允许直接下载)方法2:使用fetch获取blob(需要服务器配置CORS)由于跨域问题,方法2在服务器没有配置CORS的情况下会失败。因此,如果URL是跨域的,且没有CORS支持,则只能使用方法1(但要求URL必须是可直接下载的,且不能设置自定义请求头)。下面我们给出两种方法的实现。</think> ### 如何使用JavaScript通过URL实现文件下载功能 根据引用内容,以下是两种主流的实现方法: #### 方法一:直接创建下载链接(适合同源URL) 适用于可直接访问的同源文件,通过动态创建`<a>`标签实现下载: ```javascript function downloadByUrl(url, filename) { const link = document.createElement('a'); link.href = url; link.download = filename || url.split('/').pop(); // 自动提取文件名 document.body.appendChild(link); link.click(); document.body.removeChild(link); } // 使用示例 downloadByUrl('/files/report.pdf', '月度报告.pdf'); ``` > 原理:通过`<a>`标签的`download`属性强制触发下载[^5] #### 方法二:通过Blob对象(需CORS支持) 适用于需要处理跨域文件动态内容的场景: ```javascript async function downloadByBlob(url, filename) { try { // 1. 获取文件数据 const response = await fetch(url); const blob = await response.blob(); // 2. 创建临时链接 const blobUrl = URL.createObjectURL(blob); // 3. 触发下载 const link = document.createElement('a'); link.href = blobUrl; link.download = filename || 'download'; document.body.appendChild(link); link.click(); // 4. 清理资源 setTimeout(() => { URL.revokeObjectURL(blobUrl); document.body.removeChild(link); }, 100); } catch (error) { console.error('下载失败:', error); } } // 使用示例 downloadByBlob('https://api.example.com/export/data', 'dataset.xlsx'); ``` > 关键步骤:通过`fetch`获取二进制数据 → 转成Blob → 生成临时URL → 触发下载[^3][^4] #### 注意事项: 1. 跨域限制:方法二需目标服务器配置`Access-Control-Allow-Origin`[^2] 2. 文件名优化:建议手动指定`filename`参数确保文件名正确 3. 大文件处理:超过1GB文件建议使用流式下载 4. 移动端兼容:iOS部分浏览器需特殊处理 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木有会

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值