vue 前端等比例压缩图片(再转换成文件后上传后端)

前端压缩图片总的来说还是转base64 然后等比例放小宽和高 这个是上次压缩图片的一个扩展

压缩完之后 再将base64 转成blob再转成文件然后再上传 一生要强的前端崽子(后端不支持base64上传) 自己改吧改吧

javascript 复制代码
 // 图片上传
        async changePic(e) {
            this.isshangchuantupian=true
            this.$message.warning('图片资源正在压缩...')
            // 获取图片数据  
            var file = e.target.files[0];
            var reader = new FileReader();
            reader.readAsDataURL(file);
            let ctempfile
            let _that = this
            reader.onload = await function (event) {
                // 压缩图片  
                var img = new Image();
                img.src = event.target.result;
                img.onload = function () {
                    var canvas = document.createElement('canvas');
                    var ctx = canvas.getContext('2d');
                    var width = img.width
                    var height = img.height
                    if (Math.max(width, height) > _that.maximg) {
                        if (width > height) {
                            canvas.width = _that.maximg;
                            canvas.height = _that.maximg * height / width
                        } else {
                            canvas.height = _that.maximg
                            canvas.width = _that.maximg * width / height
                        }
                    } else {
                        canvas.width = width;
                        canvas.height = height;

                    }
                    ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
                    var dataUrl = canvas.toDataURL('image/jpeg', 0.8); // 压缩后的图片数据  
                    var blob = dataURLToBlob(dataUrl); // 将压缩后的图片数据转换为Blob对象  
                    ctempfile = new File([blob], file.name, { type: 'image/jpeg' }); // 将Blob对象封装为File对象  
                    //console.log(ctempfile)
                    let formData = new FormData()
                    // for (let i = 0; i < fileList.length; i++) {
                    //formData.append('xxxx', fileList[i])
                    //}
                    formData.append('update_image', ctempfile)
                    http
                        .post('服务器地址', formData)
                        .then(res => {
                            //console.log(res.data.update_image)
                            if (res.data.xxxx) {
                              
                                _that.isshangchuantupian=false

                            } else {
                                _that.$message({
                                    message: '图片上传失败:',
                                    type: 'error'
                                })
                            }
                        })
                        .catch(err => {
                            console.log(err)
                        })
                };
            };
            // 将Base64编码的图片数据转换为Blob对象  
            function dataURLToBlob(dataUrl) {
                var arr = dataUrl.split(','), mime = arr[0].match(/:(.*?);/)[1];
                var bstr = atob(arr[1]);
                var n = bstr.length;
                var u8arr = new Uint8Array(n);
                while (n--) {
                    u8arr[n] = bstr.charCodeAt(n);
                }
                return new Blob([u8arr], { type: mime });
            }
            //let fileList = e.target.files

        },
相关推荐
牧天白衣.1 小时前
html中margin的用法
前端·html
NoneCoder1 小时前
HTML与安全性:XSS、防御与最佳实践
前端·html·xss
沃野_juededa1 小时前
关于uniapp 中uview input组件设置为readonly 或者disabled input区域不可点击问题
java·前端·uni-app
哎哟喂_!1 小时前
UniApp 实现分享功能
前端·javascript·vue.js·uni-app
k1955142391 小时前
uniapp常用
前端·javascript·uni-app
wuhen_n4 小时前
CSS元素动画篇:基于页面位置的变换动画
前端·css·html·css3·html5
sql123456789114 小时前
前端——CSS1
前端
Nueuis4 小时前
微信小程序分页和下拉刷新
服务器·前端·微信小程序
小白64024 小时前
前端性能优化(实践篇)
前端·性能优化
白瑕4 小时前
[JavaScript]对象关联风格与行为委托模式
javascript