前端使用Compressor.js实现图片压缩上传的详细过程

 更新时间:2024年07月19日 11:04:06   作者:szx的开发笔记  
Compressor.js一个JavaScript图像压缩器,使用浏览器的原生canvas.toBlob API来执行压缩工作,这篇文章主要给大家介绍了关于前端使用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
02.12 MB114.61 KB94.72%-
0.22.12 MB349.57 KB83.90%-
0.42.12 MB517.10 KB76.18%-
0.62.12 MB694.99 KB67.99%推荐
0.82.12 MB1.14 MB46.41%推荐
12.12 MB2.12 MB0%不推荐
NaN2.12 MB2.01 MB5.02%-

测试效果

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

下面是前后的图片对比

原图

压缩后的图

总结  

到此这篇关于前端使用Compressor.js实现图片压缩上传的文章就介绍到这了,更多相关前端Compressor.js图片压缩上传内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript 继承详解(五)

    JavaScript 继承详解(五)

    在本章中,我们将分析John Resig关于JavaScript继承的一个实现 - Simple JavaScript Inheritance,需要的朋友可以参考下
    2016-10-10
  • JS中promise化微信小程序api

    JS中promise化微信小程序api

    这篇文章主要给大家通过代码实例分析了promise化微信小程序api的使用方法,对此有需要的朋友可以参考学习下。
    2018-04-04
  • 浏览器的JavaScript引擎的识别方法

    浏览器的JavaScript引擎的识别方法

    识别浏览器的JavaScript引擎的方法对PC浏览器和移动浏览器都可用,其实实现原理就是下面的这段js,感兴趣的朋友可以参考下
    2013-10-10
  • 如何在JavaScript中优雅的提取循环内数据详解

    如何在JavaScript中优雅的提取循环内数据详解

    这篇文章主要给大家介绍了关于如何在JavaScript中优雅的提取循环内数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • Bootstrap输入框组件使用详解

    Bootstrap输入框组件使用详解

    这篇文章主要为大家详细介绍了Bootstrap输入框组件的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • js实现PC端和移动端刮卡效果

    js实现PC端和移动端刮卡效果

    这篇文章主要为大家详细介绍了js实现PC端和移动端刮卡效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • JS实现京东首页之页面顶部、Logo和搜索框功能

    JS实现京东首页之页面顶部、Logo和搜索框功能

    这篇文章主要实现京东的页面顶部,logo和搜索框功能,本文有效果展示,页面布局详细分析,具体实现代码,介绍的非常详细,具有参考借鉴价值,需要的的朋友参考下吧
    2017-01-01
  • EasyUi中的Combogrid 实现分页和动态搜索远程数据

    EasyUi中的Combogrid 实现分页和动态搜索远程数据

    jquery easyui中的combogrid比较特殊,算是combo和grid的组合,combogrid结合一个可编辑的文本框和下拉数据网格面板,可以让用户迅速找到并选择,又可以进行搜索,展示与当前输入的字符相匹配的数据。下面给大家介绍EasyUi中的Combogrid 实现分页和动态搜索远程数据
    2016-04-04
  • 微信小程序实现时间预约功能

    微信小程序实现时间预约功能

    这篇文章主要为大家详细介绍了微信小程序实现时间预约基本功能,一个类似电商的时间预约功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • JS使用tofixed与round处理数据四舍五入的区别

    JS使用tofixed与round处理数据四舍五入的区别

    js中一般使用tofixed与round处理数据四舍五入,那么tofixed与round有什么区别呢?下面小编给大家分享JS使用tofixed与round处理数据四舍五入的区别,需要的朋友参考下吧
    2017-10-10

最新评论