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

        },
相关推荐
陈随易2 分钟前
Rust、Golang、MoonBit 编译成 WASM,体积和速度差距有多大?
前端·后端·程序员
IT_陈寒5 分钟前
Python多线程的坑,我居然现在才踩到
前端·人工智能·后端
摇滚侠11 分钟前
方法 A 等方法 B 执行完再执行 叫同步调用还是异步调用 JS 默认是同步调用还是异步调用
开发语言·javascript·ecmascript
格子软件1 小时前
2026年GEO优化系统源码解构:核心状态机与高并发流控深度剖析
java·vue.js·spring boot·vue·geo
触底反弹1 小时前
🔥 字符串算法面试三连击:反转、回文、回文变种,搞懂这三题稳了!
前端·javascript·算法
触底反弹1 小时前
AI Tool Use 深度解析:大模型是如何"突破物理限制"调用外部工具的?
javascript·人工智能·后端
竹林8181 小时前
从 RPC 超时到批量签名:我用 @solana/web3.js 重构了一个 NFT 铸造页面,踩了这些坑
前端·javascript
工业HMI实战笔记1 小时前
工业HMI界面布局“1核2辅”黄金结构,适配90%场景
前端·ui·性能优化·自动化·交互
优雅格子衫2 小时前
TypeScript 类的基本使用小结
javascript·ubuntu·typescript
橘子星2 小时前
从零手写 RAG 语义检索:基于 Node.js 实现轻量级向量搜索
javascript·人工智能