vant多张图上传_压缩_删除_将base64的格式转为file文件格式_每张图给不同的参数

这篇博客介绍了如何使用 Vant 框架实现多张图片上传、图片压缩、删除功能,以及如何将 Base64 格式转换为 File 文件格式,并针对每张图片传递不同参数。文中提供了一个模板示例和相应的 methods 函数方法。

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

vant after-read
基于多张图上传_图片格式大小_图片压缩_图片删除_file(binary)文件格式提交给服务端_每张图给不同的参数,代码如下

在这里插入图片描述在这里插入图片描述
template模板

      <div>
        <van-uploader
          v-model="fileListA"
          :preview-full-image="false"
          :max-count="1"
          :after-read="DetailPotoA"
          style="width: 100%;"
          :disabled="disabled?true:false"
          @delete="inmgdeleteA(0)"
          :before-read="beforeRead"
        />
        <van-uploader
          v-model="fileListB"
          :preview-full-image="false"
          :max-count="1"
          :after-read="DetailPotoB"
          style="width: 100%;"
          :disabled="disabled?true:false"
          @delete="inmgdeleteA(1)"
          :before-read="beforeRead"
        />
        <van-uploader
          v-model="fileListC"
          :preview-full-image="false"
          :max-count="1"
          :after-read="DetailPotoC"
          style="width: 100%;"
          :disabled="disabled?true:false"
          @delete="inmgdeleteA(2)"
          :before-read="beforeRead"
        />
      </div>

script中new两个函数

const myImage = new Image();
var formData = new FormData();

如图
在这里插入图片描述
methods函数方法

	//图片删除
    inmgdeleteA(index) {
      let tmp = [];
      for (let i = 0; i < this.deviceFile.length; i++) {
        if (this.deviceFile[i] !== this.deviceFile[index]) {
          tmp.push(this.deviceFile[i]);
        }
      }
      this.deviceFile = tmp;
      console.log(this.deviceFile, "this.deviceFile  -----delete");
    },
    //图片格式的判断
    beforeRead(file) {
      if (
        file.type !== "image/png" &&
        file.type !== "image/jpeg" &&
        file.type !== "image/jpg"
      ) {
        Toast("请上传 png,jpg格式图片");
        return false;
      }

      if (file.size >= 5242880) {
        Toast("请上传的图片不超过5兆");
        return false;
      }

      return true;
    },

    //将dataURL转成文件(file)格式
    dataURLtoFile(urlData, fileName) {
      var arr = urlData.split(","),
        mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      return new Blob([u8arr], { type: mime }, { name: fileName });
    },
    DetailPotoA(file) {
      this.upLoaderImgFile(file, "idcardFrontPhoto");
    },
    DetailPotoB(file) {
      this.upLoaderImgFile(file, "idcardBackPhoto");
    },
    DetailPotoC(file) {
      this.upLoaderImgFile(file, "livingPhoto");
    },

    upLoaderImgFile(file, fileName) {
      if (file.file.size < 5242880 && file.file.size >= 307200) {
        let canvas = document.createElement("canvas");
        let context = canvas.getContext("2d");
        myImage.src = file.content;
        //画布宽度
        let width = 512;
        myImage.onload = () => {
          //画布大小按照图片的比例生成
          let height = width / (myImage.naturalWidth / myImage.naturalHeight);
          // 指定canvas画布大小,该大小为最后生成图片的大小
          canvas.width = width;
          canvas.height = height;
          /* drawImage画布绘制的方法。(0,0)表示以Canvas画布左上角为起点, canvas.width, canvas.height 是将图片按给定的像素进行缩小。*/
          /* 如果不指定缩小的像素,图片将以图片原始大小进行绘制,图片像素如果大于画布将会从左上角开始按画布大小部分绘制图片,最后得到的图片就是张局部图。图片小于画布就会有黑边。*/
          context.drawImage(myImage, 0, 0, canvas.width, canvas.height);
          // 将绘制完成的图片重新转化为base64编码,file.file.type为图片类型,0.92为默认压缩质量
          file.content = canvas.toDataURL(file.file.type, 0.92);
          //将base64编码的图片转成文件(file)格式
          let lastfile = this.dataURLtoFile(file.content, file.file.name);
          //把file转换成二进制形式(binart)并进行上传
          let uploadImg = this.upLoaderImg(lastfile, fileName);
        };
      } else {
        let uploadImg = this.upLoaderImg(file.file, fileName);
      }
    },

    upLoaderImg(file, fileName) {
      console.log(file, "493测试图片名称是否变了");
      //new 一个FormData格式的参数
      let params = new FormData();
      file.fileName = fileName;

      this.deviceFile.push(file);

      this.deviceFile.map((item, index) => {
        if (item.fileName == "idcardFrontPhoto") {
          params.append("idcardFrontPhoto", item);
        }
        if (item.fileName == "idcardBackPhoto") {
          params.append("idcardBackPhoto", item);
        }
        if (item.fileName == "livingPhoto") {
          params.append("livingPhoto", item);
        }
      });
      console.log(this.deviceFile, "this.deviceFile  -----530");
      this.Data = params;
    },
Vant UI 中,`<van-uploader>` 是一个用于文件上传组件,你可以通过它的 `on-success` 或者 `on-load` 事件来获取上传成功的片信息,并将其转换为 base64 格式。 下面是一个简单的例子: ```html <template> <van-uploader ref="uploader" :action="uploadUrl" @load="handleLoad" @success="handleSuccess" multiple > <div slot="tip">点击或拖拽文件</div> </van-uploader> </template> <script> export default { data() { return { uploadUrl: 'your-upload-url', // 你的上传服务器地址 fileBase64: '', }; }, methods: { handleLoad(file) { // 文件加载完成,可以在这里预览片 let reader = new FileReader(); reader.onload = function (e) { this.fileBase64 = e.target.result; }; reader.readAsDataURL(file); }, handleSuccess(response, file) { // 上传成功,此时 response 就包含了服务器返回的信息,file 就是上传文件 // 比如你可以从中提取出片 URL 或者 ID 然后关联到 fileBase64 上 const imageUrl = response.data.url; // 提取服务器返回的片 URL // 将 URL 转换为 base64 fetch(imageUrl) .then(res => res.blob()) .then(blob => { let reader = new FileReader(); reader.onload = () => { this.fileBase64 = reader.result; }; reader.readAsDataURL(blob); }); }, }, }; </script> ``` 在这个示例中,当你上传成功后,`handleSuccess` 函数会被调用,你可以从 response 获取到片的 URL,然后通过 fetch API 或者 FileReader 对象将 URL 转化为 base64 格式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

管火火火

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值