前端jpg 转换为webp

📘 Vue3 上传图片并转为 WebP 格式的实现笔记

✅ 场景:

上传商品图片,前端使用 <el-upload> 选择 .jpg/.png,并自动将其转为 .webp 格式再提交给后端。


📦 技术栈:

  • Vue3 + script setup

  • Element Plus 上传组件

  • FileReader & Canvas API 实现图片转码


📂 关键字段:

  • selectedFile:保存最终要上传的 WebP 格式图片。

  • formData.image:只是绑定用的,不直接上传图片。


🧩 核心逻辑步骤(handleFileChange):

const handleFileChange = (file) => {
  const rawFile = file.raw; // 用户上传的原始文件
  selectedFile.value = rawFile;

  // 1. 校验格式
  if (!['image/jpeg', 'image/png'].includes(rawFile.type)) {
    ElMessage.error('只能上传 JPG 或 PNG 格式图片');
    return;
  }

  // 2. 使用 FileReader 读取图片数据
  const reader = new FileReader();
  reader.readAsDataURL(rawFile);

  reader.onload = () => {
    const img = new Image();
    img.src = reader.result;

    img.onload = () => {
      // 3. 将图片绘制到 canvas
      const canvas = document.createElement("canvas");
      canvas.width = img.width;
      canvas.height = img.height;

      const ctx = canvas.getContext("2d");
      ctx.drawImage(img, 0, 0);

      // 4. 转换为 WebP 格式,压缩质量 1.0(可选范围 0~1)
      canvas.toBlob((blob) => {
        const webpFile = new File([blob], `${rawFile.name.split('.')[0]}.webp`, {
          type: 'image/webp'
        });
        selectedFile.value = webpFile;
        ElMessage.success('图片已转换为 WebP');
      }, "image/webp", 1.0);
    };
  };
};

🧾 表单提交逻辑(submitForm):

const form = new FormData();
form.append("name", formData.name);
form.append("description", formData.description);
form.append("image", selectedFile.value); // 这里是 WebP 格式文件
form.append("category_array", JSON.stringify(formData.categoryArray));
form.append("category_text", formData.categoryText);

await requestUtil.post("product/add/", form, {
  headers: { "Content-Type": "multipart/form-data" }
});

🚨 注意事项:

  • canvas.toBlob 是异步的,确保 WebP 文件创建完成后再上传。

  • 不要直接把 canvas.toDataURL() 结果上传(那是 base64)。

  • 若后端不支持 WebP,可回退上传原始图片。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值