【element ui】el-upload的上传多张图片各种踩坑细节总结

本文介绍了在Vue.js项目中如何处理多图上传并隐藏上传按钮的场景,包括限制上传数量、图片预览和删除功能。在上传成功后,将图片地址存储为数组并转化为字符串存入数据库。

项目场景:

项目场景:在需要上传图片的一些项目中,我们可能会遇到需要上传多张图片,并且上传后要把上传的加号隐藏以及上传多张图片的存放问题(存放可能是最头疼的),把多张图片的
地址存到 一个数组里面。


问题描述

上传多张隐藏加号和地址接收问题

1111
例如:上传了五张图片后,后面的+号就不显示了。

 <el-form-item label="其它图片" prop="otherImg">
   <el-upload
            ref="upload1"  
            :class="{'hide':hideUploadAdd}"  //隐藏+号
            :action="field101Action"     //上传的接口
            list-type="picture-card"
            multiple
            :file-list="fileListUrl1"  //接收传入图片地址的数组
            :on-change="handleAddChange"
            :on-success="uploadSuccess1"
            :before-upload="field101BeforeUpload1"
            :on-preview="handlePictureCardPreview1"
            :limit="5"         //限制上传个数
            :on-remove="handleRemove1">
            <i class="el-icon-plus"></i>
            <div class="el-upload__tip" slot="tip">(请上传5张长宽1:1的图片,每张大小不超过2M)</div>
          </el-upload>
          //这是图片预览放大用的
          <el-dialog :visible.sync="dialogVisible1">
         	<img width="100%" :src="dialogImageUrl1" alt="">
          </el-dialog>
        </el-form-item>

定义data里面的数据:

  data() {
      return {
        //上传展示图片数组
        fileListUrl1:[],
        //是否隐藏+号
        hideUploadAdd:false,
        //上传接口(根据自己的接口来)
        field101Action: process.env.VUE_APP_BASE_API+"/1111/upload",
        //预览图片
        dialogImageUrl1: '',
        dialogVisible1: false,
	 }
  },
   methods: {
      // 表单重置
      reset() {
        this.fileListUrl1 = [];   //注意重置一下
        this.dialogImageUrl1 = '';
      }
       /** 图片上传 */
      uploadSuccess1(res){
        this.fileListUrl1.push(res.data.url)  //这里直接push会报错,但是改的话就不能把图片存成数组形式了,我还没有找到好的办法,所以只能先这样把功能实现了
        this.form.otherImg = this.fileListUrl1.toString()    //把上传的图片转换成数组形式存在数据库的other_img字段里面
      },
      /** 改变函数 */
      handleAddChange(file, fileList) {
        //如果图片超过五张,则不显示+号
        if (fileList.length >= 5) {
        this.hideUploadAdd = true;
        }
      },
      field101BeforeUpload1(file) {
        //限制图片大小不超过2MB
        let isRightSize = file.size / 1024 / 1024 < 2
        if (!isRightSize) {
          this.$message.error('文件大小超过 2MB')
        }
        let isAccept = new RegExp('image/*').test(file.type)
        if (!isAccept) {
          this.$message.error('应该选择image/*类型的文件')
        }
        //判断尺寸大小
        const isSize = new Promise(function (resolve, reject) {
          let _URL = window.URL || window.webkitURL;
          let img = new Image();
          img.onload = function () {
            let valid = img.width / img.height === 1;
            valid ? resolve() : reject();
          };
          img.src = _URL.createObjectURL(file);
        }).then(
          () => {
            return file;
          },
          () => {
            this.$message.error({
              message:'上传的图片尺寸比例应为1:1,请重新上传'
            });
            return Promise.reject();
            return false;
          }
        )
        return isRightSize && isAccept && isSize
      },
      handleRemove1(file, fileList) {
        //删除图片的时候也要判断一下
        if (fileList.length < 5) {
          this.hideUploadAdd = false;
        }
      },
      handlePictureCardPreview1(file) {
        this.dialogImageUrl1 = file.url;
        this.dialogVisible1 = true;
      },
   }

原因分析:

例如:Handler 发送消息有两种方式,分别是 Handler.obtainMessage()

### Element UI el-upload 组件 auto-upload 属性用法及配置 `auto-upload` 是 Element UI 的 `el-upload` 组件中的一个属性,用于控制文件上传是否在选择文件后立即触发。如果将其设置为 `false`,则需要手动调用组件的 `submit` 方法来触发上传操作[^1]。 以下是关于 `auto-upload` 属性的具体说明和使用方法: #### 1. 基本用法 当 `auto-upload` 属性被设置为 `true`(默认值)时,用户选择文件后会立即触发上传操作。如果将其设置为 `false`,则需要通过手动调用组件实例的 `submit` 方法来执行上传操作。 ```html <el-upload action="https://jsonplaceholder.typicode.com/posts/" :auto-upload="false" :on-change="handleChange"> <el-button slot="trigger" type="primary">选取文件</el-button> <el-button style="margin-left: 10px;" @click="uploadFile">上传到服务器</el-button> </el-upload> ``` #### 2. 手动触发上传 当 `auto-upload` 设置为 `false` 时,可以通过以下方式手动触发上传- 在模板中绑定按钮事件,调用组件实例的 `submit` 方法。 - 示例代码如下: ```javascript export default { methods: { uploadFile() { this.$refs.upload.submit(); // 调用组件实例的 submit 方法 }, handleChange(file, fileList) { console.log('文件改变:', file, fileList); } } } ``` #### 3. 自定义上传逻辑 如果需要实现自定义上传逻辑,可以结合 `http-request` 属性来实现。例如,使用 Axios 发起自定义的 HTTP 请求。 ```html <el-upload action="#" :auto-upload="false" :http-request="customUpload"> <el-button slot="trigger" type="primary">选取文件</el-button> <el-button style="margin-left: 10px;" @click="uploadFile">上传到服务器</el-button> </el-upload> ``` ```javascript export default { methods: { uploadFile() { this.$refs.upload.submit(); }, customUpload(params) { const formData = new FormData(); formData.append('file', params.file); axios.post('https://jsonplaceholder.typicode.com/posts/', formData) .then(response => { console.log('上传成功:', response); }) .catch(error => { console.error('上传失败:', error); }); } } } ``` #### 4. 注意事项 - 如果 `auto-upload` 设置为 `false`,必须确保通过 `submit` 方法手动触发上传,否则文件不会被上传- 在自定义上传逻辑中,可以使用 `before-upload` 钩子函数对文件进行预处理或校验。 - 如果需要显示上传进度,可以结合 `on-progress` 钩子函数实现[^2]。 ### 总结 `auto-upload` 属性提供了灵活的文件上传控制机制。通过将其设置为 `false`,可以实现更复杂的上传逻辑,例如批量上传、文件校验或自定义 HTTP 请求。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值