自定义el-upload上传

目录

前言

工具

引入库 

代码实现

注意


前言

       element-plus我相信很多前端小伙计也是使用过的,里面提供的ui组件可以说是十分好用,而这次我们目光聚焦到el-upload上,它里面提供许多的api,可以说是十分好用,但是我遇到了个业务需要:el-upload选择多个文件之后点击确定,合成一个请求,然后自动上传......

工具

    "element-plus": "^2.3.5",
    "vue": "^3.2.13",

引入库 

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
createApp(App).use(ElementPlus).use(router).mount('#app')

代码实现

<template>
    <div style="width: 200px;">
        <el-upload :auto-upload="false" :show-file-list="false" accept=".stl" multiple :on-change="handleUploadModelFile()">
            <el-button type="primary">上传文件</el-button>
        </el-upload>
    </div>
</template>
<script setup>

//合并上传的stl模型文件
function handleUploadModelFile() {
    let timer = undefined
    // let formData = new FormData()
    let fileList = []
    return async (f) => {
        fileList.push(f)
        if (!timer) {
            timer = setTimeout(() => {
                console.log(fileList);
                fileList = []
                timer = undefined
            }, 0)
        }

    }

}
</script>

        这里难点在于发送请求上传用户选择的文件需要在用户选择完文件之后调用的,我们不知道用户需要上传多少文件,这里利用异步函数setTimeout的特点,每次上传完多个文件之后会调用el-upload的on-change钩子,比如选择了3个文件,那么on-change钩子调用3次,fileList压入了3个文件对象,而setTimeout传入的函数会在调用完on-change之后执行,我们有了fileList,我们就可以这个传入setTimeout的函数内,执行多文件同步上传,或者组合成一个表单再上传。

注意

  1. on-change是一个钩子,传入的是一个函数做变量,不用加"()",而且要用":"修饰不要用"@",上面因为我使用的是闭包方法,返回的是一个函数,所以小心搞混了喔。
  2. el-upload上传文件是使用多文件多请求上传,比起文件组合成一个表单在上传速度方面更具有优势,但是一个域名下的请求链接只能有6个,之后的请求需要等待,所以使用哪种方法得看业务需求,我这里是想将路走宽一点,多个方法总会有好处。
  3. 用户点击上传文件之后,会打开文件管理器,但有时候会很慢,这个时候不如加个accept属性,里面写上需要上传的文件格式,这样文件管理器会进行过滤掉不符合accept属性的文件,这样打开会快些
<think>好的,我需要帮助用户解决如何自定义el-upload组件的图片上传方法。用户提到了Vue.jsElement-UI,所以我应该基于这两个技术来回答。首先,我需要回忆Element-UI中el-upload组件的使用方法,特别是自定义上传的部分。 根据用户提供的引用[1],他们尝试了自定义上传,使用了http-request属性,并处理了文件上传的各个阶段。引用[2]则展示了fileList的配置,用于显示已上传的图片列表。用户现在的问题是如何实现自定义图片上传,可能需要覆盖默认的上传行为,处理上传前后的操作,比如预览、删除等。 首先,我应该确认el-upload自定义上传需要设置的属性。通常,action属性需要设置为空字符串,以避免默认的上传行为。然后,使用http-request来指定自定义上传方法。另外,可能需要处理before-upload钩子来验证文件类型和大小。 接下来,用户可能需要显示上传后的图片列表,所以需要配置file-list数组,并在上传成功后更新这个数组。同时,删除功能也需要自定义,通过覆盖on-remove事件。 另外,预览功能可以通过on-preview事件来实现,可能需要使用Element-UI的对话框组件来展示大图。 还需要注意,上传按钮和列表的样式可能需要调整,比如使用list-type="picture-card"来显示图片卡片样式。同时,限制上传数量可以通过limit属性设置。 在代码示例中,需要展示如何绑定这些事件和方法,如何管理fileList的状态,以及如何与后端API交互。例如,使用axios或fetch来发送文件数据,并在上传成功后更新fileList。 可能还需要处理一些常见的错误情况,比如文件上传失败时的提示,或者文件类型不符时的校验。这些可以通过before-upload钩子的返回值来控制,返回false会阻止上传,并提示用户。 最后,确保所有功能如上传、删除、预览都能正确联动,并且界面显示符合预期。可能需要参考Element-UI的官方文档,确保使用的属性和事件都是正确的。 总结一下,步骤应该是: 1. 配置el-upload组件,设置自定义上传属性。 2. 实现http-request方法,处理文件上传逻辑。 3. 管理fileList状态,用于显示和更新上传的文件列表。 4. 添加删除和预览功能的事件处理。 5. 进行文件上传前的验证。 6. 样式调整和错误处理。 需要确保代码示例清晰,并解释每个部分的作用,帮助用户理解如何实现自定义上传功能。</think>### 实现 el-upload 自定义图片上传功能(Vue.js + Element-UI) #### 1. 基础配置与核心属性 通过设置 `action=""` 禁用默认上传行为,绑定 `:http-request` 实现自定义上传逻辑: ```vue <template> <el-upload class="upload-demo" action="" :file-list="fileList" :http-request="handleUpload" :before-upload="beforeUpload" list-type="picture-card" :on-preview="handlePreview" :on-remove="handleRemove" :limit="3" > <i class="el-icon-plus"></i> </el-upload> </template> ``` #### 2. 文件验证与上传逻辑 使用 `before-upload` 进行文件校验,`http-request` 处理自定义上传: ```javascript export default { data() { return { fileList: [] // 存储已上传文件信息 }; }, methods: { // 文件校验(格式、大小) beforeUpload(file) { const isImage = ['image/jpeg', 'image/png'].includes(file.type); const isLt2M = file.size / 1024 / 1024 < 2; if (!isImage) this.$message.error('仅支持 JPG/PNG 格式'); if (!isLt2M) this.$message.error('图片大小不能超过 2MB'); return isImage && isLt2M; }, // 自定义上传逻辑 async handleUpload({ file }) { const formData = new FormData(); formData.append('file', file); try { const res = await axios.post('/api/upload', formData); this.fileList.push({ name: file.name, url: res.data.url // 假设返回图片地址 }); } catch (error) { this.$message.error('上传失败'); } }, // 删除操作 handleRemove(file) { const index = this.fileList.findIndex(f => f.uid === file.uid); this.fileList.splice(index, 1); }, // 预览处理 handlePreview(file) { this.$alert(`<img src="${file.url}" style="width:100%">`, '图片预览', { dangerouslyUseHTMLString: true }); } } }; ``` #### 3. 关键配置说明 | 属性/方法 | 作用说明 | |------------------|--------------------------------------------------------------------------| | `list-type` | 设置显示模式为图片卡片 | | `:limit` | 限制最大上传数量 | | `file-list` | 双向绑定的文件列表数据 | | `before-upload` | 上传前校验(返回 `false` 终止上传) | | `http-request` | 覆盖默认上传行为,实现自定义上传逻辑[^1] | | `on-remove` | 处理文件删除事件 | | `on-preview` | 实现点击缩略图预览功能 | #### 4. 典型应用场景 - 需要对接非标准文件存储服务(如OSS、七牛云) - 上传需要附加额外表单数据 - 需要严格的文件格式/大小限制 - 需要自定义上传状态管理(如进度条) #### 5. 注意事项 1. 文件列表 `fileList` 需保持响应式更新 2. 删除操作需同步更新服务端数据(必要时调用删除接口) 3. 大文件上传建议分片处理 4. 图片预览可使用 `el-dialog` 或第三方插件(如 `viewer.js`)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值