vue中如何更改el-upload中的文件名name跟type , 改变后缀为webp让图片更小

<el-form-item label="标题图片:" prop="img">
    <el-upload ref="upload" action="" 
        :show-file-list="true" 
        :file-list="mainImg" 
        list-type="picture-card"
        :auto-upload="false" :limit="3" multiple     
        accept="image/jpg,image/jpeg,image/png"                                         
        :on-change="handleUpload"                                                       
        :on-remove="handleRemove"                                                       
        :on-exceed="handleMcount" />                                                   </el-form-item>

先看看代码 . 我这设置的是手动上传

 注意 : 如果是手动上传的话 , before-upload就不会生效 , 我们需要把限制图片格式跟大小的放在 on-change中

handleUpload (file, fileList) {
      const suffix = file.raw.type === 'image/jpg' || file.raw.type === 'image/png' || file.raw.type === 'image/jpeg'
      //限制文件上传类型
      if (!suffix) {
        this.$message.error("上传图片只能是 png,jpg,jpeg 格式!");
        return false
      }
      // 更改name
      this.mainImgList = fileList.map((item) => {
        const timeStamp = new Date() - 0
        // 更改图片中的name属性
        let f = new File([item.raw], `${timeStamp}_${item.raw.name}.webp`);
        f.uid = item.raw.uid; // new File 没有uid属性,会导致组件底层报错,这里手动加上
        return item.raw = f;
      })
      this.mainImg = fileList
    },

这里只做了图片大小的限制

因为我支持多张图片一起上传 , 所以这里使用了map

// 这里是上传图片按钮
this.mainImgList.map(async (item) => {
          console.log(item)
          // getWebpFileByImageFile 这个方法就是改变type
          const arr = await this.getWebpFileByImageFile(item)
          console.log(arr)
          const formMimg = new FormData()
          formMimg.append('fileArray', arr)
          // 调用上传图片的接口
          const mainImg = await uploadFile(formMimg)
        })

 这是item

 看看更改之后的 , 很明显size也减小了不少

 这个是改变图片中的type值

async getWebpFileByImageFile (imageFile) {
      const that = this
      return new Promise((resolve, reject) => {
        const imageFileReader = new FileReader();
        imageFileReader.onload = function (e) {
          const image = new Image();
          image.src = e.target.result;
          image.onload = function () {
            const canvas = document.createElement("canvas");
            canvas.width = image.width;
            canvas.height = image.height;
            canvas.getContext("2d").drawImage(image, 0, 0);
            resolve(
              that.base64ToFile(canvas.toDataURL("image/webp"), imageFile.name)
            )
          }
        }
        imageFileReader.readAsDataURL(imageFile)
      });
    },
base64ToFile (base64, fileName) {
      let arr = base64.split(','),
        type = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      return new File([u8arr], fileName, {
        type
      });

    },

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue,`el-upload` 是 Element UI 提供的一个非常方便的文件上传组件。它结合了拖放功能和普通文件选择器,可以轻松处理文件上传操作。以下是如何在 Vue 使用 `el-upload` 的基本步骤: 1. 引入依赖:首先在你的项目安装 Element UI 并引入 `el-upload` 组件。在 `main.js` 或者相应的入口文件添加: ```javascript import { ElUpload } from 'element-plus'; ``` 2. 在模板使用组件:在需要上传文件的地方添加 `<el-upload>` 标签,并设置一些基本属性,如上传路径、上传方法等。 ```html <template> <div> <el-upload :action="uploadUrl" // 上传的服务器地址 :on-success="handleSuccess" // 上传成功后的回调 :on-error="handleError" // 上传失败后的回调 :file-list="fileList" // 当前已上传文件的列表 :auto-upload="false" // 默认不自动上传,需要手动触发上传 drag accept="image/*" // 可接受的文件类型,这里仅支持图片 > <el-button>点击上传</el-button> </el-upload> </div> </template> ``` 3. 数据绑定和方法定义:在对应的 Vue 实例定义变量和方法,如 `uploadUrl`、`fileList`、`handleSuccess` 和 `handleError`。 ```javascript <script> export default { data() { return { uploadUrl: '/api/upload', // 你的上传接口地址 fileList: [], // 用于存储上传文件的信息 }; }, methods: { handleSuccess(response, file) { // 处理上传成功的回调,比如新状态或数据 this.fileList.push(file); console.log('文件 ' + file.name + ' 上传成功'); }, handleError(error, file) { // 处理上传失败的回调,比如显示错误信息 console.error('文件 ' + file.name + ' 上传失败', error); }, }, }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值