element-ui上传组件(el-upload)单文件上传,单选文件 覆盖已有文件

本文介绍了一种在Element UI的el-upload组件上实现单选文件上传的方法,通过覆盖已选文件,确保每次仅上传一个文件。利用on-exceed钩子和相关属性,实现了文件的选择与替换,保持上传文件的唯一性。
摘要由CSDN通过智能技术生成

需求:单选文件上传,每次只允许一个文件上传,当已选择了文件再次点击选择其他的文件时,需要覆盖上次选择的文件。但是看了看el-upload的开发文档,好像不支持这个需求,选择新的文件后无法替代旧的。研究了下源码找到了实现方法。

解决方案

思路

利用el-upload的on-exceed,该方法是文件超出个数限制时的钩子,当把上传文件数最大设置为1的时候再次选择新文件时会触发这个方法,利用这个对文件进行重新赋值即可。

on-exceed的回调函数有两个参数function(files, fileList),files为当前选择的文件,fileList已经选择后的文件(上次选择的),可以对fileList进行赋值来修改上传时的文件。但是只修改fileList是不够的,还需要修改el-upload里的uploadFiles,保持数据同步,不然上传后的回调函数里的字段会报错。

实例代码

HTML部分

<el-upload
                        class="col-md-6 col-lg-6 col-xs-12"
                        ref="rebateUpload"
                        :multiple="false"
                        :action="config.interfaceIP+'xxx'"
                        :headers=" {'X-CSRF-TOKEN':this.config.csrfToken}"
                        :data="{type:uploadType}"
                        :before-upload="()=>{$loading({lock: true,text: '上传中...',spinner: 'el-icon-loading',
                            background: 'rgba(0, 0, 0, 0.7)'});}"
                        :on-success="uploadRequest"
                        :limit="1"
                        :on-exceed="uploadExceed"
                        :auto-upload="false">
                    <el-button slot="trigger"  type="primary">选取文件</el-button>
                    <el-button style="margin-left: 10px;" type="success" @click="()=>{$refs['rebateUpload'].submit()}">
                        上传
                    </el-button>
                </el-upload>

注:该上传为手动上传

JS部分

            uploadExceed(files, fileList) {
                this.$set(fileList[0], 'raw', files[0]);
                this.$set(fileList[0], 'name', files[0].name);
                this.$refs['rebateUpload'].clearFiles();//清除文件
                this.$refs['rebateUpload'].handleStart(files[0]);//选择文件后的赋值方法
            },

总结

因为单选所以只要覆盖第一个值就可以了,fileList[0], '里的raw', 为选中的文件,同时替换掉文件的文件名name,再清除文件为el-upload里的uploadFiles重新赋值。

Vue.js 和 Element UI 结合可以方便地构建用户界面,Element UI 的 `el-upload` 组件恰好提供了一个现成的解决方案来处理文件上传,包括阿里云 OSS(Object Storage Service)。以下是使用 `el-upload` 实现阿里云OSS文件上传的基本步骤: 1. **安装依赖**: 首先,在 Vue 项目中安装 `ali-oss` 和 `axios`,它们分别是阿里云OSS的官方客户端库和用于发送HTTP请求的库: ``` npm install ali-oss axios ``` 2. **配置阿里云OSS**: 在你的项目中创建一个 `.env` 或者使用配置文件,添加阿里云访问信息,如 Access Key、Secret Key 和 bucket名称等: ```ini # .env or config.js ALI_OSS_ACCESS_KEY_ID=your_access_key_id ALI_OSS_SECRET_ACCESS_KEY=your_secret_access_key ALI_OSS_BUCKET_NAME=your_bucket_name ``` 3. **初始化OSS实例**: 在你的 Vue 组件里,导入必要的库,并使用环境变量初始化一个 OSS 对象: ```javascript import OSS from 'ali-oss'; const ossClient = new OSS({ accessKeyId: process.env.ALI_OSS_ACCESS_KEY_ID, secretAccessKey: process.env.ALI_OSS_SECRET_ACCESS_KEY, endpoint: 'http://oss-cn-hangzhou.aliyuncs.com', // 使用你所在区域的endpoint }); ``` 4. **`el-upload` 组件配置**: 将 `el-upload` 组件设置好,监听 `onSuccess` 事件并处理上传后的回调: ```html <template> <el-upload :action="uploadUrl" :on-success="handleSuccess" :before-upload="beforeUpload" ref="upload" multiple > <i class="el-icon-upload"></i> Click to Upload </el-upload> </template> <script> export default { data() { return { uploadUrl: '', // 这里需要拼接完整的上传URL,比如ossClient.putFile方法的结果 // 其他可能用到的变量 }; }, methods: { handleSuccess(response, file) { console.log('文件 ' + file.name + ' 上传成功'); ossClient.signURL(file.name).then(url => this.uploadUrl = url); // 获取上传到OSS的短链接 }, beforeUpload(file) { if (file.size > 1024 * 1024 * 5) { // 设置最大文件大小限制 message.error('File size exceeds the limit!'); return false; } return true; }, }, }; </script> ``` 5. **完整上传流程**: - 当用户选择文件后,组件会触发 `beforeUpload` 函数验证文件是否合法; - 如果合法,发起上传请求到 `uploadUrl`(通常由后端生成,这里仅作示例); - 文件上传成功后,`handleSuccess` 会被调用,获取上传成功的 URL 并更新到页面上。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值