Vue element自定义多图上传 一个key多个文件,自定义上传方法

本文详细介绍如何在VueElement中实现商品图片的多图上传功能,包括预览、上传及错误处理。通过自定义上传方法,确保图片上传的灵活性与用户体验。

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

Vue element自定义多图上传 一个key多个文件

业务功能阐述

  1. 图片在没有提交时预览本地的
  2. 实现商品新增功能,在点击确定后将数据统一提交给后台
  3. 只有上传以后才会生成 htts:yfvdfgh534.jpg这种服务器所存放的地址

在这里插入图片描述

  • 图片在没有提交时预览本地的

 				<el-form-item label="商品图" prop="name">
                    <el-upload
                    action="123"
                    list-type="picture-card"
                    :on-preview="handlePictureCardPreview"
                    :on-change="imgPreview"
                    :on-remove="handleRemove"
                    :auto-upload="false">
                    <i class="el-icon-plus"></i>
                    </el-upload>
                    <el-dialog :visible.sync="silder_imageVisible">
                        <img width="100%" :src="form.silder_image" alt="">
                    </el-dialog>
                </el-form-item>

action这里随便填写用:auto-upload="false"将其警用掉,使用自定义方法:on-change=“imgPreview”

对应html代码

 				<el-form-item label="商品图" prop="name">
                    <el-upload
                    action="123"
                    list-type="picture-card"
                    :on-preview="handlePictureCardPreview"
                    :on-change="imgPreview"
                    :on-remove="handleRemove"
                    :auto-upload="false">
                    <i class="el-icon-plus"></i>
                    </el-upload>
                    <el-dialog :visible.sync="silder_imageVisible">
                        <img width="100%" :src="form.silder_image" alt="">
                    </el-dialog>
                </el-form-item>

对应javascript代码

//移除图片
			//this.form.silderimgList上传后的图片文件数组
            handleRemove(file, fileList) {
                console.log('移除图片')
                this.form.silderimgList=[]
                for(let i=0;i<fileList.length;i++){
                    let str=""
                    str = fileList[i].url
                    this.form.silderimgList.push(str)
                }
                console.log(this.form.silderimgList);
                console.log('移除图片')
            },
            //点击放大图片
            handlePictureCardPreview(file) {
                this.form.silder_image = file.url;
                //console.log(file.url)
                this.silder_imageVisible = true;
            },
            //图片上传事件
            imgPreview (file, fileList) {
                let fileName = file.name;
                let regex = /(.jpg|.jpeg|.gif|.png|.bmp)$/;
                if (regex.test(fileName.toLowerCase())) {
                    this.form.silder_image = file.url;
                } else {
                    this.$message.error('请选择图片文件');
                }
                console.log('图片上传事件')
                this.form.silderimgList=[]
                for(let i=0;i<fileList.length;i++){
                    let obj={}
                    obj = fileList[i].raw
                    this.form.silderimgList.push(obj)
                }
                this.form.name = fileList[0].raw
                console.log(file,fileList);
                console.log(this.form.silderimgList);
                console.log('图片上传事件')
            },
  • 实现商品新增功能,在点击确定后将数据统一提交给后台

  • 错误示例

			getimg(){
               	let that = this 
               	//打印已包装好的文件格式数组
                console.log(that.form.silderimgList)
                let formData = new FormData();
                //that.form.silderimgList值本地预览的图片数组
                formData.append('files', that.form.silderimgList);
                //商品名
                formData.append('goodsName', that.form.silderimgList);
                //打印文件格式数组
                console.log(formData.get('files'))
                //上传服务器的api
                that.$axios({
                    method: "post",//指定请求方式
                    url: "请求地址你们自己写",//请求接口
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded;'
                    },
                    data:formData
                }).then(function(res){
                    javascriptconsole.log('成功')
                    if(res.data.code === 0){
                        that.$message({
                            message: '成功',
                            type: 'success',
                            duration: 1500
                        })
                    }else{
                        that.$message.error(res.data.message);
                    }
                })
            }
  • 当执行上面方法你会发现(包装好的文件数组和通过append放入formData()对象中的不一样)

  • 例如打印包装好的没有问题
    在这里插入图片描述
  • 打印通过append放入formData()对象中
    在这里插入图片描述
  • 向服务器发送的请求
    在这里插入图片描述
  • 正确示例

			getimg(){
                let that = this 
                let formData = new FormData();
                //that.form.silderimgList值本地预览的图片数组
                for(let i=0;i<this.form.silderimgList.length;i++){
                    formData.append('files', that.form.silderimgList[i]);
                }
                //商品名
                formData.append('goodsName', that.form.silderimgList);
                //打印文件格式数组
                console.log(formData.get('files'))
                //上传服务器的api
                that.$axios({
                    method: "post",//指定请求方式
                    url: "http://byd.isoft.mobi/api/login_filesGo",//请求接口
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded;'
                    },
                    data:formData
                }).then(function(res){
                    console.log('成功')
                    if(res.data.code === 0){
                        that.$message({
                            message: '成功',
                            type: 'success',
                            duration: 1500
                        })
                    }else{
                        that.$message.error(res.data.message);
                    }
                })
            }
  • 例如打印包装好的没有问题
    在这里插入图片描述
  • 向服务器发送的
    在这里插入图片描述
### Vue3 中实现自定义文件上传功能 在 Vue3 项目中,通过组合 API 和模板语法可以轻松构建一个自定义文件上传组件。以下是具体实现方法: #### 组件结构设计 为了增强灵活性和用户体验,通常会将文件上传逻辑封装到独立的子组件中。这样不仅可以重复利用该组件,还可以更方便地管理状态。 --- #### HTML 模板部分 ```html <template> <div class="custom-upload"> <label for="fileInput">点击上传</label> <input id="fileInput" type="file" @change="handleFileChange" style="display:none;" /> <ul v-if="files.length > 0"> <li v-for="(file, index) in files" :key="index">{{ file.name }} - {{ formatSize(file.size) }}</li> </ul> </div> </template> ``` 上述代码展示了基本布局:隐藏的 `<input>` 元素用于触发文件选择对话框,而 `@change` 事件监听器负责捕获用户选中的文件并执行回调函数[^1]。 --- #### 脚本逻辑部分 ```javascript <script setup> import { ref } from 'vue'; const files = ref([]); // 存储已选文件列表 function handleFileChange(event) { const selectedFiles = Array.from(event.target.files); if (selectedFiles.length === 0) return; validateAndAddFiles(selectedFiles); } function validateAndAddFiles(filesToAdd) { const validFiles = filesToAdd.filter((file) => /^image\//.test(file.type)); if (validFiles.length !== filesToAdd.length) { alert('仅支持片类型的文件'); } files.value.push(...validFiles); clearInput(); } function clearInput() { document.getElementById('fileInput').value = ''; // 清除输入框以便再次选择相同文件 } function formatSize(sizeInBytes) { const kb = sizeInBytes / 1024; if (kb < 1024) return `${Math.round(kb * 10) / 10} KB`; const mb = kb / 1024; return `${mb.toFixed(2)} MB`; } </script> ``` 此脚本实现了以下几个核心功能: - **文件验证**:只允许上传片类型文件[^3]。 - **动态更新文件列表**:当用户选择了新文件时,将其添加至当前文件数组中。 - **清空输入框**:每次完成文件选择后重置 `<input>` 值,从而允许次操作相同的文件名而不被忽略。 - **大小格式化**:提供友好的文件尺寸显示方式。 --- #### 样式美化 虽然基础功能已经具备,但良好的视觉效果同样重要。可以通过 CSS 定义按钮样式以及展示区域的外观。 ```css <style scoped> .custom-upload label { display: inline-block; padding: 8px 16px; background-color: #4CAF50; color: white; border-radius: 4px; cursor: pointer; transition: all 0.3s ease-in-out; } .custom-upload label:hover { background-color: #45a049; } .custom-upload ul { list-style-type: none; margin-top: 1em; padding-left: 0; } .custom-upload li { font-size: 0.9rem; line-height: 1.5; } </style> ``` 以上样式使标签看起来像一个按钮,并且鼠标悬停时会有颜色变化反馈给用户。 --- #### 集成 Element Plus(可选) 如果希望进一步扩展功能或者简化开发流程,则可以选择引入第三方库如 Element Plus 来辅助实现某些复杂需求,比如进度条、拖拽上传等功能[^2]。 示例代码如下所示: ```javascript <el-upload action="#" :auto-upload="false" :on-change="handleChange" multiple> <el-button>点击上传</el-button> </el-upload> <script setup> import { ElMessage } from 'element-plus'; import { ref } from 'vue'; const uploadedFiles = ref([]); function handleChange(file, fileList) { uploadedFiles.value = fileList.map(item => item.raw).filter(f => f && /^image\//.test(f.type)); if (uploadedFiles.value.length < fileList.length) { ElMessage.warning('存在非法文件类型,请重新确认!'); } } </script> ``` 这里我们使用了 `Element Plus` 提供的标准组件来替代手动编写 DOM 结构的方式,同时保留了类似的校验机制。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值