前端使用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图片压缩上传内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 用js动态添加html元素,以及属性的简单实例

    用js动态添加html元素,以及属性的简单实例

    下面小编就为大家带来一篇用js动态添加html元素,以及属性的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • JavaScript实现为指定对象添加多个事件处理程序的方法

    JavaScript实现为指定对象添加多个事件处理程序的方法

    这篇文章主要介绍了JavaScript实现为指定对象添加多个事件处理程序的方法,可实现让指定对象处理多个事件的功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • Jupyter Notebook运行JavaScript的方法

    Jupyter Notebook运行JavaScript的方法

    Jupyter Notebook是一块所见即所得的画布,通过在浏览器上编辑代码,让开发人员实现展示与快速迭代的利器,本文主要介绍了Jupyter Notebook运行JavaScript的方法,感兴趣的可以了解一下
    2021-05-05
  • JS动态加载脚本并执行回调操作

    JS动态加载脚本并执行回调操作

    这篇文章主要为大家详细介绍了JS动态加载脚本并下载完成后执行回调操作,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 使用JavaScript + HTML实现表格滚动效果

    使用JavaScript + HTML实现表格滚动效果

    本文介绍了如何使用HTML、CSS和JavaScript实现表格滚动效果,特别是在大屏展示或排行榜场景中,通过平滑滚动动画,提升信息展示效率,支持数据动态更新和播放暂停控制,使用户能够高效浏览大量数据,需要的朋友可以参考下
    2026-04-04
  • 原生js实现吸顶效果

    原生js实现吸顶效果

    本文主要介绍了原生js实现吸顶效果的示例。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • javascript 一段代码引发的思考

    javascript 一段代码引发的思考

    写在前面:这是一个关于Ext, Prototype, JavaScript方面的问题,其实下面遇到的问题本不是问题,都是因为错误的理解造成的,本文的宗旨是希望读者朋友避免我犯的同类错误,遇事三思而后行,同时也体会下发现问题,解决问题,反思问题这种精神活动所带来的快乐!
    2009-01-01
  • javascript实现上传图片并预览的效果实现代码

    javascript实现上传图片并预览的效果实现代码

    图片上传预览,就是在使用文件选择框选择了文件之后就可以在页面上看见图片的效果,关于这个效果我一直认为是无法做到的
    2011-04-04
  • axios params 和 data 的区别小结

    axios params 和 data 的区别小结

    本文介绍了在前端开发中使用Axios发送HTTP请求时,params和data的区别及其应用场景,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • 使用webpack-dev-server处理跨域请求的方法

    使用webpack-dev-server处理跨域请求的方法

    本篇文章主要介绍了使用webpack-dev-server处理跨域请求的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04

最新评论