VUE利用 element-ui的上传图前的压缩图片到4M之内

VUE利用 element-ui的上传图前的压缩图片到4M之内

<el-upload
	class="avatar-uploader"
	action="123"
	:http-request="upload"//自定义上传接口
	:show-file-list="false"
	:before-upload="beforeAvatarUpload">//利用before-upload上传前的操作进行压缩
</el-upload>

在VUE项目下创建一个 js文件


export const compress = (file) => {
        return new Promise((resolve, reject) => {
        	//判断上传的格式
            const isJPG = file.type === 'image/jpeg' || file.type === 'image/png';
            if (!isJPG) {
                this.$message.error('上传头像图片只能是 JPG/PNG 格式!');
            };
            //console.log(file.size)
            let isLt2M = file.size / 1024 / 1024 > 4 // 判定图片大小是否小于4MB
            let image = new Image(), resultBlob = '';
            image.src = URL.createObjectURL(file);
            image.onload = () => {
                // 调用方法获取blob格式,方法写在下边
                if(file.size / 1024 / 1024 < 4){
                    console.log('小于4M')
                }else{
                    resultBlob = compressUpload(image, file);//压缩的图片
                    //console.log(resultBlob)
                }
                resolve(resultBlob)
            }
            image.onerror = () => {
                reject()
            }
        })
}

  /* 图片压缩方法-canvas压缩 */
function  compressUpload(image, file) {
                
    let canvas = document.createElement('canvas')
    let ctx = canvas.getContext('2d')
    let initSize = image.src.length
    let { width } = image, { height } = image
    canvas. width = width
    canvas.height = height
    ctx.fillRect(0, 0, canvas.width, canvas.height)
    ctx.drawImage(image, 0, 0, width, height)
    
    let i = 1;
    while (i>0.1) {
        let compressData = canvas.toDataURL(file.type || 'image/jpeg' || 'image/png',Number(i.toFixed(2)))
        // 压缩后调用方法进行base64转Blob,方法写在下边
        let blobImg = dataURItoBlob(compressData) 
    
        if(blobImg.size/1024/1024 < 4 ){
            return blobImg
        }
       //根据想要压缩到的大小进行压缩 0-1之间
        if(blobImg.size/1024/1024 > 10){i-= 0.1}
         if((blobImg.size/1024/1024 < 10) && (blobImg.size/1024/1024 > 8) ){i-= 0.06}
         if((blobImg.size/1024/1024 < 8) && (blobImg.size/1024/1024 > 6) ){i-= 0.03}
         if((blobImg.size/1024/1024 < 6) && (blobImg.size/1024/1024 > 5 )){i-= 0.02}
         if((blobImg.size/1024/1024 < 5) && (blobImg.size/1024/1024 > 4) ){i-= 0.01}
    }
}

/* base64转Blob对象 */
function dataURItoBlob(data) {
    let byteString;
    if(data.split(',')[0].indexOf('base64') >= 0) {
        byteString = atob(data.split(',')[1])
    }else {
        byteString = unescape(data.split(',')[1])
    }
    let mimeString = data
        .split(',')[0]
        .split(':')[1]
        .split(';')[0];
    let ia = new Uint8Array(byteString.length)
    for( let i = 0; i < byteString.length; i += 1) {
        ia[i] = byteString.charCodeAt(i)
    }
   
    return new Blob([ia], {type: mimeString})
}

使用方法

//在VUE的script中引入决赛文件
<script>
 import {compress} from '../../utils/reduce'
 	methods:{
	 beforeAvatarUpload(file) {
              return compress(file) //吧file传入就可以了
          },
}
 </script>

在这里插入图片描述

上传后压缩到小于4M的 然后提交后台就OK了!!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,以下是实现 Vue+Element-UI上传图片压缩的基本步骤: 1. 安装依赖 在项目中安装 Element-UI 和插件 vue-image-crop-upload 以及图片压缩库,可使用以下命令: ``` npm install element-ui vue-image-crop-upload compressjs --save ``` 2. 引入 Element-UI 在 main.js 中引入 Element-UI: ```javascript import Vue from 'vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI) ``` 3. 使用 vue-image-crop-upload 在需要上传图片的组件中使用 vue-image-crop-upload,可使用以下代码: ```vue <template> <div> <vue-image-crop-upload ref="upload" :url="uploadUrl" :headers="uploadHeaders" :size="size" :accept="accept" :beforeUpload="beforeUpload" :cropConfig="cropConfig" :compressConfig="compressConfig" @input="handleInput" @crop-success="handleCropSuccess" > <el-button size="small" type="primary">上传图片</el-button> </vue-image-crop-upload> </div> </template> <script> import VueImageCropUpload from 'vue-image-crop-upload' export default { components: { VueImageCropUpload }, data() { return { uploadUrl: 'xxx', // 上传地址 uploadHeaders: { // 上传请求头 Authorization: 'Bearer ' + getToken() }, size: 1024 * 1024 * 2, // 上传图片大小限制 accept: '.jpg,.jpeg,.png', // 上传图片格式限制 cropConfig: { // 图片裁剪配置 aspectRatio: 1 / 1, autoCropArea: 1, viewMode: 1, zoomable: false, guides: false, dragMode: 'move', cropBoxResizable: false, crop: () => {} }, compressConfig: { // 图片压缩配置 targetSize: 1024 * 1024, // 目标大小 quality: 0.7, // 压缩质量 mimeType: 'image/jpeg' // 输出格式 } } }, methods: { beforeUpload(file) { // 文件上传前的回调函数 this.$refs.upload.startUpload() }, handleInput(file) { // 文件选择后的回调函数 this.$refs.upload.showCrop() }, handleCropSuccess(blob, file) { // 图片裁剪成功后的回调函数 this.compressImage(blob, file) // 压缩图片 }, compressImage(blob, file) { // 图片压缩 const reader = new FileReader() reader.readAsDataURL(blob) reader.onload = (e) => { const base64 = e.target.result const compressedBlob = Compress.compress(base64, this.compressConfig) const compressedFile = new File([compressedBlob], file.name, { type: compressedBlob.type }) this.$emit('upload', compressedFile) // 触发上传事件 } } } } </script> ``` 4. 完成上传 在父组件中监听上传事件,使用 axios 或其他方法上传文件至服务器: ```vue <template> <div> <upload :action="uploadUrl" @upload="handleUpload"></upload> </div> </template> <script> import axios from 'axios' import Upload from './Upload.vue' export default { components: { Upload }, data() { return { uploadUrl: 'xxx' // 上传地址 } }, methods: { handleUpload(file) { const formData = new FormData() formData.append('file', file) axios.post(this.uploadUrl, formData).then(response => { console.log(response.data) }) } } } </script> ``` 以上就是实现 Vue+Element-UI上传图片压缩的基本步骤,您可以根据您的具体需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值