当前位置: 代码网 > it编程>编程语言>Javascript > 前端使用Compressor.js实现图片压缩上传的详细过程

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

2024年09月07日 Javascript 我要评论
compressor.js官方文档安装npm install compressorjs使用在使用elementui或者其他ui框架的上传组件时,都会有上传之前的钩子函数,在这个函数中可以拿到原始fil

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com