el-upload上传文件

文章讲述了如何使用`http-request`属性在HTML上传文件时与后端通信,包括使用FormData正确传递文件和参数,以及处理上传后的文件列表同步、错误处理和删除机制。作者还提到不同情况下如何确保文件名显示和文件管理的细节。

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

需求:选中或拖拽文件后,使用http-request属性实现自动上传,并根据后端传回来的结果显示错误和控制fileList的显示,如果后端返回成功,则文件显示在文件列表处,如果后端返回失败,则文件列表不显示这个文件并提示错误。
在这里插入图片描述
html源码:

<el-upload
	  class="upload-demo"
	  drag
	  action="#"
	  :http-request="uploadFile"
	  :file-list="fileList"
	  :on-error="uploadError"
	  ref="uploadArr"
	  :on-change="changeFile">
	  <i class="el-icon-upload"></i>
	  <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
</el-upload>

js源码:

changeFile(file){
	  this.fileList=JSON.parse(JSON.stringify(this.fileList));
	  this.newFile=file;
	  // this.fileList.push(fileList);
	  // console.log("changefileList",this.fileList);
},
uploadFile(file){
	  var formData = new FormData();
	  formData.append('file', file.file);
	  formData.append('versionType', parseInt(this.formdata.versionType));
	  this.$axios({
		    url: `/proxy_version/renew/uploadFile`,
		    method: 'post',
		    data:formData,
		    success: (result) => {
		      console.log("result",result);
		      if(result.data===''){
		        this.$message.error(result.msg);
		        console.log("uploadfileList",this.fileList);
		        // file.onError();
		      }else{
		        this.fileList.push(this.newFile);
		      }
		    }
	  });
}

问题一:上传的文件只传了uid给后端

解决方案:
可以使用formData来进行参数和文件的传递,FormData 会将文件自动转换成二进制流,并且将header中的Content-type编码类型被设为 “multipart/form-data”,这种编码方式被用作文件传输提高传输效率,不再需要自己设定。
如果不使用FormData ,手动设定Content-type编码类型,那么传输的文件将不是二进制,而是一个json的map集合,并且只存在uid。

也可以使用base64但是会增大工作量。

var formData = new FormData();
formData.append('file', file.file);
formData.append('versionType', parseInt(this.formdata.versionType));

....axios传输代码
//body参数
 data:formData,
 ....

问题二:this.fileList不会自动新增

在data中设置了fileList,并且:file-list="fileList"进行绑定,但是上传后this.fileList并没有新增文件。

1.设置on-change方法(未成功)

onchange方法可以得到新上传的file文件,我们可以通过push方式将文件加入fileList,以此来更新fileList,但是遇到问题。

changeFile(file){
	  this.fileList.push(file);
	  console.log("changefileList",this.fileList);
},

问题:在上传后会自动给fileList进行增加,但是如果这个文件符合前端所有的限制要求,则在文件列表处会显示该文件,并且是打勾的状态,可是后端返回报错,这个文件不可用,那么我们需要从文件列表处自动删除这个文件。
如果是在axios的success处进行删除this.fileList.splice(-1);,则针对从未上传过的文件,页面会出现文件出现后会马上消失,如果是已经上传过的,则会出现组件上下跳动一下。

2.解决方案

// on-change
changeFile(fileList){
		// 使得界面中文件列表增加的效果消失
	  this.fileList=JSON.parse(JSON.stringify(this.fileList));
	  // 记录下新增加的文件
	  this.newFile=file;
},
// on -remove,当删除文件时,this.fileList也需要手动删除
handleRemove (file, fileList) {
  this.fileList = fileList;
},

最后根据后端的返回结果去修改fileList,从而达到效果。

success: (result) => {
   console.log("result",result);
   if(result.data===''){
     this.$message.error(result.msg);
     // file.onError();
   }else{
   // 界面中的文件列表会出现新上传的文件
     this.fileList.push(this.newFile);
   }
 }
注意:文件列表处显示的文件需要有name属性,才会显示文件名

3.拓展

1.

可以使用file.onError();去手动调用on-error绑定的方法。使用这个方法后文件会从文件列表处消失。
file.onSuccess()等等

2.

// 可以清空已上传的文件
this.$refs.uploadArr.clearFiles();

clearFiles() 方法只会清空已上传的文件,而不会清空待上传的文件队列。如果需要同时清空待上传的文件队列,可以使用 clearQueue() 方法。

3.

但是在on-change,on-remove,before-remove等(http-request、on-error中得不到fileList)绑定的方法中都可以获得操作的file以及fileList(这里的fileList是自带的,可以得到当前所有文件列表的文件,不是data中自己设置的fileList)
即有两个fileList,一个自己在data设置的,一个是自带的,如果对data中的fileList不进行修改时,会一直为空,即使上传了文件,组件默认修改的是自带的fileList。
zuizhong
changeFile绑定给on-change(文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用,不包含删除),上面this.fileList不接收新上传的文件,文件列表最终只显示一个文件,但是在后面调用before-remove时发现自带的和this.fileList内容是一样的,都只有一个。

// on -remove,当删除文件时,this.fileList也需要手动删除,不然自带的fileList会进行删除,
//this.fileList不会进行删除,文件列表最终显示的是自带的fileList。
 handleRemove(file, fileList) {
	  this.fileList = fileList;
	  console.log("删除",this.fileList);
	  console.log("删除file",file);
},
beforeRemove(file, fileList) {
	  console.log("确定",fileList,file);
	  return this.$confirm(`确定移除 ${file.name}`);
},
在 `element-ui` 的 `el-upload` 组件中,可以通过设置 `accept` 属性来限制用户上传文件类型。该属性接受一个字符串参数,表示允许上传文件类型,其语法格式类似于 HTML 中 `<input>` 元素的 `accept` 属性。 ### 使用方式 #### 1. 常见文件类型的限制 要限制上传文件类型,可以直接将 `accept` 设置为指定的 MIME 类型或文件扩展名。例如: - **限制为图片文件**(如 PNG、JPG): ```html <el-upload action="https://example.com/upload" :accept="'.png, .jpg, .jpeg'" > <el-button type="primary">点击上传</el-button> </el-upload> ``` - **限制为 PDF 文件**: ```html <el-upload action="https://example.com/upload" :accept="'.pdf'" > <el-button type="primary">点击上传</el-button> </el-upload> ``` - **限制为 Word 文档和 Excel 表格**: ```html <el-upload action="https://example.com/upload" :accept="'.doc, .docx, .xls, .xlsx'" > <el-button type="primary">点击上传</el-button> </el-upload> ``` #### 2. 使用 MIME 类型限制文件类型 除了通过文件扩展名进行限制外,还可以使用 MIME 类型。例如,限制上传文件为图片类型: ```html <el-upload action="https://example.com/upload" :accept="'image/*'" > <el-button type="primary">点击上传</el-button> </el-upload> ``` 此配置允许所有图片类型的文件上传,包括 `.png`、`.jpg`、`.gif` 等。 #### 3. 多种文件类型混合限制 如果需要同时支持多种文件类型,可以组合使用扩展名和 MIME 类型。例如,限制上传文件为图片和 PDF: ```html <el-upload action="https://example.com/upload" :accept="'image/*, .pdf'" > <el-button type="primary">点击上传</el-button> </el-upload> ``` ### 注意事项 - `accept` 属性仅用于前端限制,无法完全阻止用户上传非法类型的文件。为了确保安全性,后端仍需对上传文件类型进行验证。 - `accept` 属性不支持动态绑定,因此不能直接使用 Vue 的响应式数据绑定功能[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值