当前位置:网站首页>uniapp-小程序与H5压缩图片上传
uniapp-小程序与H5压缩图片上传
2022-07-13 19:34:00 【去成华大道走二仙桥】
目录
场景:上传图片过大导致接口响应时间过长
方法:上传前进行图片压缩
话不多说直接贴代码
我们先定义一个工具文件,类如utils.js
微信小程序压缩方法
/**
* 递归压缩微信图片
* @param url 图片路径
* @param count 已递归次数(有可能压缩不到想要的大小,所以得限制次数)
* @param isReturnBase64 是否返回base64
* @param callback 回调函数
* @return
*/
export function recursionCompressWechat(url, count, isReturnBase64, callback) {
// 在递归五次后结束递归
if (count > 5) {
if (isReturnBase64) {
WechatTobase4(url)
} else {
callback && callback(url);
}
return;
}
// 将图片进行压缩
uni.compressImage({
src: url, // 图片路径
quality: 40, // 压缩质量
success: (resCompress: any) => {
console.log(resCompress, "压缩后");
// 先获取压缩后的体积,大于1M就继续压缩
uni.getFileInfo({
filePath: resCompress.tempFilePath,
success: (resFileInfo: any) => {
if (resFileInfo.size > 1024 * 1024) {
//压缩后大于1M就继续压缩
count++;
recursionCompressWechat(resCompress.tempFilePath, count, isReturnBase64, callback);
return;
} else {
if (isReturnBase64) {
WechatTobase4(resCompress.tempFilePath)
} else {
callback && callback(resCompress.tempFilePath)
}
}
},
});
},
fail: (resCompress) => {
callback(url);
},
});
// 微信-url转base64
function WechatTobase4(url) {
uni.getFileSystemManager().readFile({
filePath: url, //选择图片返回的相对路径
encoding: "base64", //编码格式
success: async (res) => {
callback && callback("data:image/" + "png" + ";base64," + res.data);
},
fail: (res) => {
console.log(res, "wxPathTobase64-error");
},
});
}
}H5压缩图片方法
由于uniapp的uni.compressImage方法不支持H5,所以我们自己封装一个简易的图片压缩方法

/**
* 递归压缩H5图片
* @param url 图片路径
* @param isReturnBase64 是否返回base64
* @param callback 回调函数
* @return
*/
export function recursionCompressH5(url, isReturnBase64, callback) {
uni.getImageInfo({
src: url,
success(res) {
let canvasWidth = res.width; //图片原始长宽
let canvasHeight = res.height;
let img = new Image();
img.src = res.path;
let canvas = document.createElement("canvas");
let ctx = canvas.getContext("2d");
canvas.width = canvasWidth / 2;
canvas.height = canvasHeight / 2;
ctx.drawImage(img, 0, 0, canvasWidth / 2, canvasHeight / 2);
canvas.toBlob(function (fileSrc) {
let imgSrc = window.URL.createObjectURL(fileSrc);
uni.getFileInfo({
filePath: imgSrc,
success: (resFileInfo: any) => {
if (resFileInfo.size > 1024 * 1024) {
//压缩后大于1M就继续压缩
recursionCompressH5(imgSrc, isReturnBase64, callback);
return;
} else {
//小于就转化base64
let resultBase64 = canvas.toDataURL("image/png")
callback && callback(!isReturnBase64 ? resultBase64: imgSrc)
}
},
});
});
}
});
}简单使用场景
// 常用的上传组件
//HTML部分
<u-upload
ref="uUpload"
max-count="9"
:auto-upload="true"
:action="action"
:before-upload="handleBeforeUpload"
>
</u-upload>
import { recursionCompressH5, recursionCompressWechat } from "@/utils.js"
//JS部分
// 上传图片钩子函数
handleBeforeUpload(index, lists) {
this.handlerecursionCompressH5(lists[index].url);
return false;
},
handlerecursionCompress(url) {
if (isH5) {
// H5压缩 -- 最后一个参数为业务上传图片代码方法
recursionCompressH5(url, true, this.handleUpload);
} else {
// 小程序
recursionCompressWechat(url, 1, true, this.handleUpload);
}
},
handleUpload() {
//....
//上传压缩后的图片
}上传组件u-upload的before-upload钩子函数相信大家都不陌生,我们在钩子函数里面对图片进行压缩,压缩完成后执行上传操作
// 上传图片钩子函数
handleBeforeUpload(index, lists) {
this.handlerecursionCompressH5(lists[index].url);
return false;
},
handlerecursionCompress(url) {
if (isH5) {
// H5压缩
recursionCompressH5(url, true, this.handleUpload);
} else {
// 小程序
recursionCompressWechat(url, 1, true, this.handleUpload);
}
},如果能帮助到大家可以点赞评论收藏三连~
边栏推荐
猜你喜欢

Cao Jie spark programming Scala version after class exercise answers

成员函数之析构函数

HCIP第二个实验

Preorder and inorder traversal sequences determine a binary tree (restore binary tree)

dtcloud的消息机制(三)

音视频学习(七)——AAC音频码流

HCIP第五天笔记

Interprocess communication (very practical)

老树开花——用ImageProcessor快速搭一个图床应用

Shutter renderflex overflowed by pixels on the bottom keyboard pop-up warning exception
随机推荐
Jupyterab installation
Judge whether two binary trees are isomorphic, and three implementation methods (recursion, queue, stack)
用 AnimatedBuilder 分离组件和动画,实现动效复用
jupyterlab 安装
HCIP第一天笔记
np.unravel_index() 求出数组某元素(或某组元素)拉成一维后的索引值在原本维度(或指定新维度)中对应的索一般与np.argmax(A) 或 np.argmin(A) 配合使用
Mongoose 的 存在则更新,不存在则新增
odoo action分析(action.client,action.act_window,action.server)
PG operation and maintenance -- service start and stop
Shutter renderflex overflowed by pixels on the bottom keyboard pop-up warning exception
spark期末考试选择题精选
C语言开发环境搭建:VSCode+GCC
创原会丨携手50+云原生企业,共探跨越数字化鸿沟新模式
匿名管道原理及详解(非常实用)
modular
input获取焦点
C language development environment construction: vscode+gcc
Hcip static routing
this指针介绍
arduino上传程序出错不成功常见的问题解决