原生JavaScript上传文件

本文介绍了在Vue项目中不使用Element-UI组件时,如何实现原生上传文件,包括创建input元素、处理文件格式验证、上传接口调用及后端返回二进制流的下载方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做vue项目的时候,不可避免地要上传文件,有时候不想用Element-UI的组件,就搞起了原生上传,代码如下,看注释就可以了:

// 上传文件接口
export function myUploadFile(data) {
  return request({
    url: "/system/oss/upload",
    method: "post",
    data,
  });
}

// 开始上传
startUpload() {
	// 创建一个input元素
	let input = document.createElement("input");
	// 类型设为文件
	input.type = "file";
	// 选取图片点击确定的时候触发
	input.onchange = () => {
		// 这里我只是上传单个文件,所以选取第一个,多个的话可以在外面搞个循环
		let file = input.files[0];
		// 获取文件名中.最后一次出现的索引
		let index = file.name.lastIndexOf(".");
		// 获取后缀名
		let suffix = file.name.substring(index + 1);
		// 将后缀名统一转为小写,方便进行格式校验
		// 其实在安全性这块只用前端来过滤是不够的,因为可以抓包对后缀名进行修改
		if (this.picFormat.indexOf(suffix.toLowerCase()) == -1) {
			this.$message.warning("只允许上传图片");
		} else {
			// 转为二进制流,开始上传
			let blob = new FormData();
			// append的第一个参数‘file’,对应后端接收的参数名,一致即可
			blob.append("file", file);
			// 调用上传接口,把blob传过去
			myUploadFile(blob).then((res) => {
				if (res.code == 200) {
					this.$message.success("上传成功!");
					// 接收后端返回的图片ID、服务器地址(可用于预览等等)
					this.form.ossId = res.data.ossId;
					this.form.url = res.data.url;
				} else {
					this.$message.error("上传失败!");
				}
			});
		}
	};
	// 模拟点击
	input.click();
	// 移除该元素
	input.remove();
}

顺带提一下下载,后端如果返回二进制流的话,可以这么处理:

// 下载,记得要设置一下responseType
export function download(data) {
  return request({
    method:'post',
    url:`/manage/work/exportExcel`,
	responseType: 'blob',
    data
  })
}

// whichFile指的是你想下载哪个文件
download(whichFile).then((res) => {
  // 设置下载的文件名
  let fileName = 'XXXXXXXXXXX'
  // 将二进制流转成一个网络地址,用a标签指向它
  let url = window.URL.createObjectURL(res);
  let link = document.createElement("a");
  link.href = url;
  // 记得添加download属性,最后模拟点击、移除等
  link.setAttribute("download", fileName);
  link.click();
  link.remove();
})

特此记录!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值