vue 通过 image-conversion 实现图片压缩

简介

vue项目中,上传图片时如果图片很大,通过 image-conversion 压缩到指定大小

1. 安装依赖

复制代码
npm i image-conversion --save

2. 引用

复制代码
import * as imageConversion from 'image-conversion'

3. 使用

复制代码
const newFile = new Promise((resolve) => {
	// 压缩到500KB,这里的500就是要压缩的大小,可自定义
	imageConversion.compressAccurately(file, 500).then(res => {
	  resolve(res)
	}).finally(() => {
	  console.log('将图片文件压缩到了500kb')
	})
})

4. 实际场景应用

复制代码
<!--  上传按钮  -->
<el-upload
  action=""
  class="upload"
  multiple
  accept=".png, .jpg, .jpeg"
  :before-upload="beforeDocumentUpload"
  :http-request="beforeAvatarUpload"
  :on-preview="handlePictureCardPreview"
  :before-remove="handlerBeforeRemove"
  :file-list="pictureList"
  :limit="10"
  :on-exceed="handleExceed"
  list-type="picture-card"
>
  <i class="el-icon-plus" />
</el-upload>
<!--  预览大图 -->
<el-dialog :visible.sync="imgVisible" :append-to-body="true">
  <img width="100%" :src="dialogImageUrl" alt="">
</el-dialog>

methods:

复制代码
methods: {
	// 上传前
    beforeDocumentUpload(file) {
      const size = file.size / 1024 / 1024
		
	  // 上传的图片大小不能超过10M
      if (size > 10) {
        this.$message.warning('文件大小不能超过10M!')
        return false
      }
      const extension = this.getFileType(file)
		
	  // 只支持 png, jpg, jpeg 格式
      if (!['png', 'jpg', 'jpeg'].includes(extension)) {
        this.$message.warning('只能上传png、jpg、jpeg格式文件!')
        return false
      }
      
      // 大于0.5M压缩成0.5M
      if (size > 0.5) {
        const loading = this.$loading({
          lock: true,
          text: '加载中'
        })
        // 压缩
        const newFile = new Promise((resolve) => {
          // 压缩到500KB,这里的500就是要压缩的大小,可自定义
          imageConversion.compressAccurately(file, 500).then(res => {
            resolve(res)
          }).finally(() => {
            loading.close()
          })
        })
        console.log('newFIle', newFile)
        return newFile
      }
      return true
    },
    // 上传
    beforeAvatarUpload(file) {
      const self = this
      const reader = new FileReader()
      reader.readAsDataURL(file.file)
      reader.onload = function(e) {
        // const img_base64 = e.target.result
        // 自定义数组对象,传给后台的数据
        self.imgBase64Array.push({
          uid: file.file.uid,
          base64Str: file
          // base64Str: img_base64
        })
      }
    },
    // 预览大图
	handlePictureCardPreview(file) {
	  this.dialogImageUrl = file.url
	  this.imgVisible = true
	},
	// 删除图片
    handlerBeforeRemove(file, fileList) {
      this.imgBase64Array = this.imgBase64Array.filter((p) => p.uid !== file.uid)
    },
    handleExceed() {
      this.$message.warning('图片数量最多为10张')
    },
},
相关推荐
qq_5470261798 小时前
Flowable 工作流引擎
java·服务器·前端
刘逸潇20058 小时前
CSS基础语法
前端·css
Sheldon一蓑烟雨任平生9 小时前
Vue3 插件(可选独立模块复用)
vue.js·vue3·插件·vue3 插件·可选独立模块·插件使用方式·插件中的依赖注入
吃饺子不吃馅9 小时前
[开源] 从零到一打造在线 PPT 编辑器:React + Zustand + Zundo
前端·svg·图形学
小马哥编程10 小时前
【软考架构】案例分析-Web应用设计(应用服务器概念)
前端·架构
鱼与宇10 小时前
苍穹外卖-VUE
前端·javascript·vue.js
啃火龙果的兔子10 小时前
前端直接渲染Markdown
前端
z-robot10 小时前
Nginx 配置代理
前端
用户479492835691511 小时前
Safari 中文输入法的诡异 Bug:为什么输入 @ 会变成 @@? ## 开头 做 @ 提及功能的时候,测试同学用 Safari 测出了个奇怪的问题
前端·javascript·浏览器
没有故事、有酒11 小时前
Ajax介绍
前端·ajax·okhttp