vue前端实现上传文件的两种方式

这篇具有很好参考价值的文章主要介绍了vue前端实现上传文件的两种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.使用form表单的形式

第一种方式就是使用FormData的方式进行上传

html代码:

<el-form :model="upform" :rules="uprules" style="width:100%;" ref="upform" label-width="100px">
                <el-form-item label="上传附件:">
                    <el-button type="primary"
                                    @click="upLoad()"
                                    size="mini"
                                    class="form-btn"
                                    >点击上传</el-button>
                </el-form-item>
</el-form>

JS代码:

// 请求-上传附件
    upLoad() {
        const _this = this;
        //   const fileType = [
        //     "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        //     "application/vnd.ms-excel"
        //   ];
        const fileType = ['xls','xlsx','et']
        const inputFile = document.createElement("input")
        inputFile.type = "file"
        inputFile.style.display = "none"
        document.body.appendChild(inputFile)
        inputFile.click()
        inputFile.addEventListener("change",function() {
            const file = inputFile.files[0];
            var testmsg = file.name.substring(file.name.lastIndexOf('.') + 1)
            if (!fileType.includes(testmsg)) {
              _this.$message.warning("上传的文件格式只能是,xls,xlsx,et");
              document.body.removeChild(inputFile);
              return false;
            }
             const formData = new FormData();
            formData.append("file", file);
            window.request({
                url:'xxx/xxx',
                data:formData,
                success:(res)=> {
                 if (res.code === 200) {
                     _this.$message.success(res.message || "导入成功");
                     _this.getTableList();
                 }else {
                  _this.$message.success("导入失败");
                 },
                finally:()=> {
                    document.body.removeChild(inputFile);
                })
       
            })
        },

2.使用element-ui的el-upload的方式进行上传

这里我是根据需求封装了一个组件文章来源地址https://www.toymoban.com/news/detail-680601.html

<template>
    <div id="uploadFile">
		<el-form-item :label="uploadParams.label" :label-width="uploadParams.labelWidth" :id="uploadParams.key">
			<el-upload 
			    :data="paramsData"
				:ref="uploadParams.key"
	    	    class="upload-demo"
	    	    :before-upload="beforeUploadFile"
	    	    :action="actionUrl"
	    	    :on-preview="handlePreview"
	    	    :on-success="handleSuccess"
	    	    :on-error="handleError"
	    	    :before-remove="beforeRemove"
	    	    :on-remove="handleRemove"
				:disabled="uploadParams.disabled?uploadParams.disabled: false"
	    	    :limit="uploadParams.limit?uploadParams.limit:1"
	    	    :on-exceed="handleExceed"
	    	    :file-list="uploadParams.fileList">
	    		<el-button size="small" :disabled="uploadParams.disabled?uploadParams.disabled: false" type="primary">点击上传</el-button>
	    		<div v-if="uploadParams.showTip?uploadParams.showTip: false" slot="tip" class="el-upload__tip" style="word-break:break-all;"> {{`只能上传${uploadParams.type}文件,且不超过${uploadParams.fileSize}M`}} </div>
	    		<div v-if="uploadParams.showTip2?uploadParams.showTip2: false" slot="tip" class="el-upload__tip" style="word-break:break-all;color:red"> {{`只能上传${uploadParams.limit}个${uploadParams.type}文件,再次上传需要删除之前的模板`}} </div>
	    	</el-upload>
		</el-form-item>
	</div>
</template>
<script>
// ===============上传文件组件使用=================
// =========嵌套在el-form中调用组件: <el-from>  <uploadFile :uploadParams="传递参数" @getFileIdReturn="接受上传文件id数组回传"></uploadFile>  </el-form>
// =========  uploadParams中参数说明: label: form的label,labelWidth: form的label-width, key: 指定的组件标识,
// ================================    fileList: 存放文件数组,limit:存放限制上传数量,
// ================================	  type: 附件类型(.xxx),多种以英文逗号分隔, fileSize: 附件大小(M为单位)
// ================================   , showTip: 是否展示提示信息
// 
import fileAPI from "@/api/fileApi";
import Config from "@/settings";
export default {
	name: "uploadFile",
	props: {
		uploadParams: Object,
		paramsData:Object
	},
	data() {
		return {
			fileIdList: [],//存放附件id数组
			actionUrl: process.env.VUE_APP_BASE_API + "xxxx/xxxx",//文件上传地址
			removeUrl: 'xxxx/xxx',// 删除文件地址
		}
	},
	created() {},
	methods: {
		// 文件上传成功时的钩子
    	handleSuccess(res, file, fileList) {
    		this.$message.success("文件上传成功");
    		let filename = fileList.map(item => {
    			return item.name;
    		});
			this.fileIdList.push(res.data.fid);
			this.$emit("getFileIdReturn", this.fileIdList);//返回文件id数组
		},
		// 文件上传失败时的钩子
		handleError() {
			this.$message.error("文件上传失败");
		},
		handleExceed(files, fileList) {
    	//上传超过限制个数
			this.$message.warning(`当前限制选择 ${this.uploadParams.limit} 个文件,本次选择了 ${ files.length } 个文件,
				共选择了 ${files.length + fileList.length} 个文件`
    		);
    	},
    	beforeRemove(file, fileList) {
    		if(file.url==undefined){
    			return;
    		}
    		// 移除前钩子
    		return this.$confirm(`确定移除 ${file.name}?`)
    	},

    	// 上传文件之前的钩子, 参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传
    	beforeUploadFile(file) {
    		console.log('before upload')
    		// console.log(file)
    		const extension = file.name.substr(file.name.lastIndexOf('.') + 1);
    		console.log('extension', extension)
			const size = file.size / 1024 / 1024;
			let temp = this.uploadParams.type.split(",");
			let typeArr = [];
			temp.forEach(element => {
				typeArr.push(element.substr(element.lastIndexOf('.') + 1));
			});
    		if (!(typeArr.includes(extension)) ) {
    			this.$message.warning(`只能上传后缀是${this.uploadParams.type}的文件`)
    			return false
    		}
    		if (size > this.uploadParams.fileSize) {
    			this.$message.warning(`文件大小不得超过${this.uploadParams.fileSize}M`)
    			return false
    		}
    		return extension && size
    	},
    	handleRemove(file, fileList) {
    		// 移除附件时钩子
			console.log(file);
    		let id; 
			if(file.url) {
				id = file.url.split("id=")[1];
			}else if(file.response) {
				id = file.response.data.fid;
			}else {
				this.uploadParams.fileList = fileList;
				return
			}
    		window.request({
				url: this.removeUrl,
				data: {
					ids: id
				},
    			success: (res) => {
					if(res.code === 200) {
						this.$message.success("删除成功!");
						this.uploadParams.fileList = fileList;
						this.fileIdList.forEach((element, index) =>{
							if(element == id) {
								this.fileIdList.splice(index, 1);
							}
						});
            			this.handLoadingShow(false)
						this.$emit("getFileIdReturn", this.fileIdList);//返回文件id数组
					}
    			}
    		})
    	},
    	handlePreview(file) {
    		//点击文件列表中已上传的文件时的钩子
			  console.log(file);
			let fileurl;
			if(file.url) {
				fileurl = Config.downUrl + file.url;
			}else {
				fileurl = Config.downUrl + process.env.VUE_APP_BASE_API + "xxx/下载地址" + file.response.data.fid;
			}
			window.location.href = fileurl;
		},
		// 上传控件的回显====回显加载时使用
    	loadFileList (urlAndFid) {//参数url加文件
    		let templateList = null;
    		const downloadUrl = process.env.VUE_APP_BASE_API + xxx/xxx";
			this.uploadParams.fileList = [];
			this.fileIdList = [];
    		window.request({
    			url: urlAndFid,
    			success: ({ data }) => {
    				templateList = data;
    				templateList.forEach((element, index) => {
    					const obj = {};
    					obj.name = templateList[index].name;
    					obj.url = downloadUrl + templateList[index].id;
    					obj.id = templateList[index].id;
						this.uploadParams.fileList.push(obj);
						this.fileIdList.push(obj.id);
					});
					this.$emit("getFileIdReturn", this.fileIdList);//返回文件id数组
    			}
    		});
		},
		loadFileList2 (fileUrl, fileParam) {//url: fileUrl,参数fileParam
    		let templateList = null;
    		const downloadUrl = process.env.VUE_APP_BASE_API + "xxx/xxx";
			this.uploadParams.fileList = [];
			this.fileIdList = [];
    		window.request({
				url: fileUrl,
				data: fileParam,
    			success: ({ data }) => {
    				templateList = data;
    				templateList.forEach((element, index) => {
    					const obj = {};
    					obj.name = templateList[index].name;
    					obj.url = downloadUrl + templateList[index].id;
    					obj.id = templateList[index].id;
						this.uploadParams.fileList.push(obj);
						this.fileIdList.push(obj.id);
					});
					this.$emit("getFileIdReturn", this.fileIdList);//返回文件id数组
    			}
    		});
    	},
	}
}
</script>

到了这里,关于vue前端实现上传文件的两种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在Leaflet中使用Turf.js生成范围多边形的两种实现方式

    目录 前言 一、场景需求 1、Leaflet.js的不足 2、Turf.js 二、原始数据展示 1、点位数据展示  2、定义样式 3、定位数据初始化 三、Turfjs中bbox生成  1、官网讲解 2、轨迹bbox生成 四、Turfjs生成外包多边形 1、官网例子 2、凸多边形生成 总结         在一些共享出行的应用地图中

    2024年03月14日
    浏览(90)
  • gitee上传代码到仓库的两种方式

    代码上传到gitee有两种方式 通过命令窗口实现 通过idea实现 目录 一、gitee创建仓库  二、通过命令行上传代码到仓库  1.打开命令行  2.配置信息  3.初始化本地仓库  4.上传代码至本地仓库  5.添加注释  6.本地仓库与远程仓库连接 7.强制推送(远程仓库为空可跳过) 8.本地仓

    2024年02月10日
    浏览(41)
  • 前端vue elementUI upload上传组件封装&多文件上传&进度条,后端servlet request.getPart()接收文件信息

    选中多个文件上传 通过 axios请求 onUploadProgress 方法监听 on-progress on-success 用这两个钩子函数实现进度条 下面有对应的函数。 本文是每个文件一个请求上传 也可以用一个请求上传多个文件,需要将文件遍历添加到 form 表单中,后端用 request.getParts(); 获取集合,有需要的可以改

    2024年02月11日
    浏览(54)
  • js 实现纯前端将数据导出excel两种方式

    将table标签,包括tr、td等对json数据进行拼接,将table输出到表格上实现,这种方法的弊端在于输出的是伪excel,虽说生成xls为后缀的文件,但文件形式上还是html,代码如下 通过将json遍历进行字符串拼接,将字符串输出到csv文件,代码如下

    2024年02月15日
    浏览(29)
  • React下载文件的两种方式

    React下载文件的两种方式 - 代码先锋网 不知道有用没用看着挺整齐  没试过

    2024年02月12日
    浏览(39)
  • Vue中强制更新数据的两种方式

    有时候我们发现修改了数据源后视图并没有更新,这里提供两种解决方案 Vue中强制更新数据的方法有两种。 方法一: 使用forceUpdate强制渲染,更新视图和数据。 注:全局强制刷新,性能消耗高。 方法二: this.$set()方法是Vue自带的可对数组和对象进行赋值,并触发监听的方法

    2024年02月11日
    浏览(53)
  • vue 生成二维码的两种方式

    方式一:qrcode(无 icon 图标) 完整代码 方式二:vue-qr(有 icon 图标) 官网地址:vue-qr - npm import 引入方式 完整代码 相关配置属性 属性名 含义 text 编码内容 correctLevel 容错级别(0 - 3) size 尺寸,长宽一致, 包含外边距 margin 二维码图像的外边距,默认 20px colorDark 实点的颜色

    2024年02月15日
    浏览(39)
  • 【Java项目】Vue+ElementUI+Ceph实现多类型文件上传功能并实现文件预览功能

    先说一下我们的需求,我们的需求就是文件上传,之前的接口是只支持上传图片的,之后需求是需要支持上传pdf,所以我就得换接口,把原先图片上传的接口换为后端ceph,但是其实大致的处理流程都差不多,都是上传到后端然后得到url地址。 要实现点击预览文件,那么就需

    2024年02月15日
    浏览(53)
  • Vue+ElementUI+Axios实现携带参数的文件上传(数据校验+进度条)

    可以实现对上传文件的类型,大小进行数据校验,以及对上传文件所要携带的数据也进行的校验,也有文件上传进度的进度条。 一、Vue 结构部分 弹窗显示(文件上传框+文本框+单选按钮) 二、JS部分 1、数据和数据校验部分 2、方法部分 三、后端代码(Springboot) 1、接口层方

    2024年01月17日
    浏览(41)
  • vue3+elementui-plus实现一个接口上传多个文件

    首先,先使用element-plus写好上传组件,变量的定义我在这里就省略了都 然后,绑定的函数都补充一下 然后,假设有个提交按钮,点击上传文件请求接口 既然有编辑,那就应该做回显的逻辑,文件如何回显到上传组件上 over 以上主要通过代码说明,可根据自己实际情况改造

    2024年02月13日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包