vue+elementUI使用upload组件实现文件上传功能

本文介绍了一个基于Vue和Element UI的文件上传实现案例,通过el-upload组件以formdata形式上传文件到后端,并提供了完整的代码示例。

项目中需要上传文件,用的vue+elementUI,使用的上传组件是elementUI的el-upload组件,通常用到过的上传方式有两种

1.上传到云服务器,再把返回的连接给后端

2.以formdata的方式直接传给后端

这里使用的是第二种方式手动上传的方式进行上传文件,较为简单。

过多的文字描述让人头大,直接上代码。

<template>
  <div class="contain">
    //accept为上传的格式
    //limit为上传文件限制数
    //file-list为上传文件列表
    <el-upload
      class="upload-demo sendData"
      :action="UploadUrl()"
      accept=".xls"
      :on-preview="handlePreview"
      :on-change="fileChange"
      :before-remove="beforeRemove"
      :limit="1"
      :http-request="uploadFile"
      :auto-upload="true"
      :on-exceed="handleExceed"
      :file-list="fileList"
    >
      <el-button size="small" type="primary" class="dataSendBtn">上传数据</el-button>
      <!-- <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> 
<think>好的,我现在需要解决用户的问题:如何在VueElementUI实现手动触发文件上传功能。根据用户提供的引用内容,特别是引用[1],用户提到官方文档通常展示的是自动上传,而实际开发中可能需要手动上传,比如结合表单提交。用户需要具体的解决方案或代码示例。 首先,我要回顾ElementUI的上传组件ElementUIel-upload组件默认情况下,当用户选择文件后会自动上传到指定的URL。但用户希望手动控制上传时机,比如在选择文件后先进行一些处理,然后通过按钮触发上传。 根据引用[1]中的情况,用户可能需要手动上传,比如在表单提交时一起上传文件。这时候需要阻止自动上传,改为手动触发。查阅ElementUI的文档,el-upload组件有一个auto-upload属性,将其设置为false可以关闭自动上传。然后,需要通过ref来获取上传组件的方法,手动调用submit方法。 接下来,我需要考虑如何收集文件。用户选择文件后,文件会被添加到el-upload的fileList中。但根据引用[3],用户提到在on-change钩子中获取的file参数可能不是原始文件对象,而是包含raw属性的对象。因此,需要遍历fileList,提取每个文件的raw属性,这些才是真正的File对象,可以用于手动上传。 另外,用户可能需要在提交表单时,将文件数据与其他表单数据一起发送到后端。这时候,可能需要使用FormData对象来构造请求体,将文件和其他字段附加进去,然后通过axios或其他HTTP库发送请求。 还需要考虑上传成功后的处理,比如显示成功消息、更新文件列表,或者处理错误情况。根据引用[3],上传成功后可能需要回显图片,但这里用户的需求是手动上传,所以可能需要处理上传后的回调,比如清空文件列表或显示上传结果。 现在,我需要将这些步骤整合成一个清晰的示例代码。首先,在模板中使用el-upload组件,设置auto-upload为false,绑定on-change事件以更新文件列表。然后,添加一个按钮,点击时触发手动上传的方法。在方法中,通过ref获取上传组件的文件列表,提取raw文件,构造FormData,使用axios发送POST请求。同时,处理上传成功或失败的回调,给出用户反馈。 需要注意,上传的action属性可能需要设置为一个有效的后端接口URL,或者如果暂时没有,可以留空,然后在手动上传的方法中自定义请求。另外,文件类型的验证、大小限制等也可以通过before-upload钩子处理,但由于是手动上传,可能需要在提交时进行验证。 最后,测试示例代码的正确性,确保文件能被正确收集和上传,处理各种边界情况,比如没有选择文件时点击上传按钮的提示,上传过程中的加载状态等,以提升用户体验。</think>在VueElementUI实现手动触发文件上传功能,可通过以下步骤实现: ### 一、解决方案核心要点 1. 禁用自动上传:设置`auto-upload=false` 2. 通过ref获取上传文件列表 3. 手动提交时使用FormData封装文件数据 4. 调用XMLHttpRequest或axios实现上传 ### 二、代码实现示例 ```html <template> <div> <!-- 手动上传组件 --> <el-upload ref="uploadRef" action="#" // 留空或填写实际接口地址 :auto-upload="false" :on-change="handleFileChange" :file-list="fileList"> <el-button type="primary">选择文件</el-button> </el-upload> <!-- 手动触发按钮 --> <el-button @click="submitUpload">立即上传</el-button> </div> </template> <script> export default { data() { return { fileList: [], rawFiles: [] // 存储原始文件对象[^3] } }, methods: { // 文件选择变化事件 handleFileChange(file, fileList) { this.fileList = fileList this.rawFiles = fileList.map(item => item.raw) // 提取原始文件[^3] }, // 手动上传触发 async submitUpload() { if (this.rawFiles.length === 0) { this.$message.warning('请先选择文件') return } const formData = new FormData() this.rawFiles.forEach(file => { formData.append('files[]', file) // 根据后端接口调整字段名 }) try { const response = await this.$axios.post('/api/upload', formData, { headers: {'Content-Type': 'multipart/form-data'} }) this.$message.success('上传成功') this.$refs.uploadRef.clearFiles() // 清空已选文件 } catch (error) { this.$message.error('上传失败') } } } } </script> ``` ### 三、关键实现说明 1. **禁用自动上传**:通过`auto-upload=false`关闭自动提交[^1] 2. **获取原始文件**:从on-change事件的file参数中提取raw属性获取真实File对象[^3] 3. **表单数据封装**:使用FormData处理多文件上传格式要求 4. **请求头设置**:必须设置`'Content-Type': 'multipart/form-data'`才能正常上传 5. **状态清理**:上传完成后调用clearFiles()方法重置组件状态 ### 四、扩展功能建议 1. **文件类型验证**:通过before-upload钩子添加格式校验 ```js :before-upload="(file) => { const isJPG = file.type === 'image/jpeg' if (!isJPG) this.$message.error('仅支持JPG格式') return isJPG }" ``` 2. **进度显示**:可通过axios的onUploadProgress回调实现进度条 3. **大文件分片**:超过2GB文件建议使用web-file-uploader等分片上传方案
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值