vue项目通用下载方法

vue项目文件下载方法

1、方法的封装

在utils/request.js文件里

// 通用下载方法
export function download(url, params, filename) {
	return service
		.post(url, params, {
			transformRequest: [(params) => { return tansParams(params);}],//通过transformRequest配置项,对请求的参数进行了转换,使用了一个名为tansParams的函数来进行参数转换。
			headers: { "Content-Type": "application/x-www-form-urlencoded" },//指定请求的数据格式为表单形式
			responseType: "blob"//设置响应的数据类型为blob,以便能够处理二进制数据
		})
		.then((data) => {//当请求成功时,执行回调函数。这里将响应的数据赋值给content变量,并使用Blob对象创建一个二进制数据对象blob。
			const content = data;
			const blob = new Blob([content]);
			if ("download" in document.createElement("a")) {//检查浏览器是否支持使用download属性进行文件下载
				const elink = document.createElement("a");//创建<a>元素并设置相关属性
				elink.download = filename;
				elink.style.display = "none";
				elink.href = URL.createObjectURL(blob);
				document.body.appendChild(elink);//将<a>元素添加到文档中,并模拟点击
				elink.click();
				URL.revokeObjectURL(elink.href);//释放URL对象的内存
				document.body.removeChild(elink);//从文档中移除<a>元素
			} else {
				navigator.msSaveBlob(blob, filename);//针对IE浏览器的兼容处理,使用navigator.msSaveBlob()方法将blob对象保存为文件。
			}
		})
		.catch((r) => {
			console.error(r);
		});
}

总之,上述代码通过发送POST请求获取服务器返回的文件数据,并根据浏览器的支持情况,使用不同的方式进行文件下载,以实现通用的下载功能。
或者

// 通用下载方法
export function download(url, params, filename) {
	//根据需要添加文件下载时的样式
    downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", })
    return service.post(url, params, {
        transformRequest: [(params) => { return tansParams(params) }],
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        responseType: 'blob'
    }).then(async (data) => {
        const isLogin = await blobValidate(data);
        if (isLogin) {
            const blob = new Blob([data])
            saveAs(blob, filename)
        } else {
            const resText = await data.text();
            const rspObj = JSON.parse(resText);
            const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
            Message.error(errMsg);
        }
        downloadLoadingInstance.close();
    }).catch((r) => {
        console.error(r)
        Message.error('下载文件出现错误,请联系管理员!')
        downloadLoadingInstance.close();
    })
}

补充:涉及到的参数处理函数

export function tansParams(params) {
  let result = "";
  for (const propName of Object.keys(params)) {
    const value = params[propName];
    var part = encodeURIComponent(propName) + "=";
    if (value !== null && typeof value !== "undefined") {
      if (typeof value === "object") {
        for (const key of Object.keys(value)) {
          if (value[key] !== null && typeof value[key] !== "undefined") {
            let params = propName + "[" + key + "]";
            var subPart = encodeURIComponent(params) + "=";
            result += subPart + encodeURIComponent(value[key]) + "&";
          }
        }
      } else {
        result += part + encodeURIComponent(value) + "&";
      }
    }
  }
  return result;
}

上述代码通过遍历请求参数对象,将参数名和参数值进行编码,并拼接为URL查询字符串的形式。如果参数值是对象类型,则会将对象的属性名和属性值进行编码,并拼接为形如propName[key]=value的字符串。最终返回转换后的URL查询字符串。
这个函数通常用于将请求参数转换为符合URL规范的形式,以便于发送HTTP请求。

补充:涉及到的二进制处理函数

// 验证是否为blob格式
export async function blobValidate(data) {
    try {
        const text = await data.text();//该方法将data对象转换为文本格式
        JSON.parse(text);//尝试将文本数据解析为JSON格式。如果解析成功,说明数据不是Blob格式,而是一个可解析为JSON的字符串
        return false;
    } catch (error) {
        return true;
    }
}

上述代码通过尝试将数据转换为文本,并尝试解析为JSON格式来验证数据是否为Blob格式。如果解析成功,说明数据不是Blob格式,返回false;如果解析失败,说明数据是Blob格式,返回true。
这个函数通常用于判断数据类型,以便在不同的情况下采取不同的处理方式。

2、方法的使用

首先在main.js中引入该方法

import { download } from "@/utils/request";
// 全局方法挂载
Vue.prototype.download = download;

然后通过事件触发使用该方法

/** 导出按钮操作 */
handleExport() {
     this.download('project/using_device_client/export', //接口url
     {
          ...this.queryParams//参数
     }, 
     `project_CoUsingDeviceClient.xlsx`)//文件名
 },
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值