前端使用Compressor.js实现图片压缩上传

前端使用Compressor.js实现图片压缩上传

Compressor.js官方文档

安装

npm install compressorjs

使用

在使用ElementUI或者其他UI框架的上传组件时,都会有上传之前的钩子函数,在这个函数中可以拿到原始file,这里我用VantUI的上传做演示

afterRead 函数是上传之前的钩子,可以获取到原始file

<template>
  <div>
    <van-uploader
      :max-count="prop.limit"
      v-model="state.fileList"
      :after-read="afterRead"
      :before-read="beforeRead"
      @delete="deleteFile"
    />
  </div>
</template>
<script setup>
import { reactive, defineEmits, defineProps, watch } from 'vue'
import { FileUploadFun } from '@/api/index.js'
import { useCustomFieldValue } from '@vant/use'
import { Toast } from 'vant'
import Compressor from 'compressorjs'

const prop = defineProps({
  url: {
    type: String,
    default: '',
  },
  limit: {
    type: Number,
    default: 5,
  },
})
const emit = defineEmits(['onSuccess'])
const state = reactive({
  fileList: [],
})

watch(
  () => prop.url,
  () => {
    if (prop.url) {
      state.fileList = []
      prop.url.split(',').forEach((item) => {
        state.fileList.push({
          url: item,
        })
      })
    }
  }
)

// 文件上传之前对图片进行压缩
const beforeRead = (file) => {
  return new Promise((resolve, reject) => {
    new Compressor(file, {
      // 压缩质量,0-1之间。数字越小,压缩比越高
      quality: 0.2,
      success(result) {
        // 默认返回result是blob类型的文件,可以转成file并返回,交给afterRead钩子进行上传
        let newFile = new File([result], file.name, { type: file.type })
        resolve(newFile)
      },
      error(err) {
        reject(err)
      },
    })
  })
}

// 文件上传后触发
const afterRead = (file) => {
  file.status = 'uploading'
  file.message = '上传中...'

  FileUploadFun(file.file)
    .then((res) => {
      file.status = 'done'
      file.message = '上传成功'
      let urls = state.fileList.map((i) => i.url)
      urls.pop()
      urls.push(res.data.url)
      // 通知外界上传成功
      emit('onSuccess', urls.join(','))
    })
    .catch(() => {
      state.fileList.pop()
      file.status = 'done'
      Toast('上传失败')
    })
}

// 文件删除后触发
const deleteFile = () => {
  emit('onSuccess', state.fileList.map((i) => i.url).join(','))
}

// 用于返回信息
useCustomFieldValue(() => state.fileList.map((item) => item.url).join(','))
</script>

示例

Quality 原始大小 压缩后大小 压缩比 Description
0 2.12 MB 114.61 KB 94.72% -
0.2 2.12 MB 349.57 KB 83.90% -
0.4 2.12 MB 517.10 KB 76.18% -
0.6 2.12 MB 694.99 KB 67.99% 推荐
0.8 2.12 MB 1.14 MB 46.41% 推荐
1 2.12 MB 2.12 MB 0% 不推荐
NaN 2.12 MB 2.01 MB 5.02% -

测试效果

image-20240510141040120

可以看到压缩前的图片大小3.29M,压缩后343KB

在这里插入图片描述

下面是前后的图片对比

原图

测试img

压缩后的图

压缩后的测试img

相关推荐

  1. vue3图片,进行图片压缩(image-compressor.js)

    2024-05-11 09:50:07       26 阅读
  2. 图片&视频压缩的考察

    2024-05-11 09:50:07       60 阅读
  3. 对用户图片进行压缩

    2024-05-11 09:50:07       37 阅读
  4. uniapp图片压缩之后在

    2024-05-11 09:50:07       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-11 09:50:07       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-11 09:50:07       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-11 09:50:07       82 阅读
  4. Python语言-面向对象

    2024-05-11 09:50:07       91 阅读

热门阅读

  1. vue3+ts父子通信

    2024-05-11 09:50:07       35 阅读
  2. AI时代:低代码与人工智能引领科技创造新时代

    2024-05-11 09:50:07       31 阅读
  3. 蓝桥杯备战5.图书管理员

    2024-05-11 09:50:07       31 阅读
  4. Cocos Creator 中编码规范 (6)

    2024-05-11 09:50:07       26 阅读
  5. 【Unity】编程感悟20240510

    2024-05-11 09:50:07       29 阅读
  6. C++ Primer Plus 知识的讲解

    2024-05-11 09:50:07       26 阅读
  7. Mysql实现双机bin-log热备份

    2024-05-11 09:50:07       38 阅读
  8. chrome命令的使用

    2024-05-11 09:50:07       30 阅读