javascript下载文件五种方式

前言

整理javascript下载文件五种方式,接收后台返回流下载或直接下载文件。欢迎补充~

业务场景

假设通过后端接口返回的流,需要前端点击【下载到本地】按钮下载文件。

一.window.location.href下载

最简单的方式:url即文件或接口地址,额外参数通过url后问号拼接参数,后端get请求方式接收。

let url='http://10.0.0.103:6767/file/downloadFile'
window.location.href = url

缺陷:
1.直接访问可能会覆盖当前页面地址,影响用户体验。
2.图片、pdf 等url资源会表现为预览而非下载。

二.window.open()下载

用指定的名称将指定的资源加载到浏览器上下文(窗口 window ,内嵌框架 iframe 或者标签 tab )。
如果没有指定名称,则一个新的窗口会被打开并且指定的资源会被加载进这个窗口的浏览器上下文中。
url为后端提供的文件下载路径

let url='http://10.0.0.103:6767/file/downloadFile'
window.open(url);

缺陷:
这个方法只能将指定路径的资源加载到浏览器里面,如果文件不能被浏览器浏览,那就会被浏览器下载到本地。反之,如果下载一个txt文本,用该方法会直接预览txt文件。

三.iframe 下载

和创建动态a标签的逻辑大同小异。

<el-button size="mini" @click="handleExport(item)">导出</el-button>
function handleExport(item) {
		try {
      let url='http://10.0.0.103:6767/file/downloadFile';
			let elementIftrame = document.createElement("iframe");
			elementIF.src = url;
			elementIF.style.display = "none";
			document.body.appendChild(elementIftrame);
		}catch(error) {
			console.log(error);
		}
	}

四.【动态a标签】结合【axios方法】的方式下载

-axios请求将后端给的文件流下载下来
-若该接口有登录校验,将下载的文件流转换成blob数据,反之不需要这一步
-通过window.URL.createObjectURL(blob)将blob转化成url
-通过动态生成a标签,模拟点击下载事件
-完成下载动作

1.若/getZipInfo接口没有登录校验,就不用下载文件流转成blob数据。
let curHost=window.location.host
let fileName=`module_20230920.zip`
let url=`${curHost}/service/getZipInfo?fileName=${fileName}`
// 创建下载按钮a标签进行自动点击下载,下载完后移除按钮a标签
let downloadDom=document.createElement('a')
downloadDom.href=url
// downloadDom.download=fileName //--不是必须 若需要【前端重命名文件夹】的话这句代码就需要
document.body.appendChild(downloadDom)
downloadDom.click()
document.body.removeChild(downloadDom)
2.若/getZipInfo接口有登录校验,就需要把下载文件流转成blob数据再下载,res为文件流
let fileName=`module_20230920.zip`
let blob=new Blob([res],{type:'application/octet-stream'})
let href=window.URL.createObjectURL(blob)
// 创建下载按钮a标签进行自动点击下载,下载完后移除按钮a标签
let downloadDom=document.createElement('a')
downloadDom.href=href
downloadDom.download=fileName //--不是必须 若需要【前端重命名文件夹】的话这句代码就需要
document.body.appendChild(downloadDom)
downloadDom.click()
document.body.removeChild(downloadDom)
window.URL.revokeObjectURL(href)

五.form表单的形式下载【比较少用到,借鉴别人的方法】

function handleExport() {
		let url='http://10.0.0.103:6767/file/downloadFile'
		var form = $("<form>")
		form.attr("style", "display:none")
		/**target 属性规定一个名称或一个关键词,指示在何处打开 action URL,
		 * 即在何处显示提交表单后接收到的响应。
		 *
		 *_blank 在新窗口/选项卡中打开。
		 *_self 在同一框架中打开。(默认)
		 *_parent 在父框架中打开。
		 *_top 在整个窗口中打开。
		 *framename 在指定的 iframe 中打开。
		 */
		form.attr("target", "_self");
		form.attr("method", "get");
		form.attr("action", url);
		$("body").append(form);
		// 提交
		form.submit();
	}

注意: 若下载的文件包解压时需要密码的话,前后端生成的文件名必须一致才能解压,否则无法会导致解压失败。

转载请注明原作者
不喜勿喷,欢迎补充~~

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值