PHP+JS(pako)前后端数据压缩,节省带宽方案(Uint8Array与Base64互转、gzip压缩、gzinflate、gzdeflate、zlib、大数据压缩)

本文介绍了如何使用JavaScript的pako库和PHP进行数据压缩与解压,涉及Uint8Array与Base64的转换,包括前端JS压缩后端PHP解压及反之的场景,适用于节省带宽的解决方案。注意事项提到前端可单独引入压缩或解压脚本,PHP环境需兼容4.0.4及以上版本。

一、准备工具

1.pako脚本库

github地址 | 我的csdn资源地址

2.前端Uint8Array与Base64互转函数(代码如下)

// uint8array转为base64字符串
function uint8arrayToBase64(u8Arr) {
    let CHUNK_SIZE = 0x8000; //arbitrary number
    let index = 0;
    let length = u8Arr.length;
    let result = '';
    let slice;
    while (index < length) {
        slice = u8Arr.subarray(index, Math.min(index + CHUNK_SIZE, length));
        result += String.fromCharCode.apply(null, slice);
        index += CHUNK_SIZE;
    }
    // web image base64图片格式: "data:image/png;base64," + b64encoded;
    // return  "data:image/png;base64," + btoa(result);
    return btoa(result);
}
// base64字符串转为uint8array数组
function base64ToUint8Array(base64String) {
    let padding = '='.repeat((4 - base64String.length % 4) % 4);
    let base64 = (base64String + padding)
        .replace(/\-/g, '+')
        .replace(/_/g, '/');
    let rawData = window.atob(base64);
    let outputArray = new Uint8Array(rawData.length);
    for (var i = 0; i < rawData.length; ++i) {
        outputArray[i] = rawData.charCodeAt(i);
    }
    return outputArray;
}

二、具体用法案例

1.前端JS压缩+后端PHP解压

// JS压缩,注意:需要引入dist/pako_deflate.js(仅支持压缩)或dist/pako.js(支持压缩和解压)
var rawData = {title:"this is pako.defalte test",author: "slongzhang@qq.com", date: "2021-04-02", content: "test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test"}
var binaryString = pako.deflateRaw(JSON.stringify(rawData), { to: 'string' });
var compressedBase64  = uint8arrayToBase64(binaryString);
console.log(compressedBase64);// q1YqySzJSVWyUirJyCxWAKKCxOx8vZTUtMScklSFktTiEiUdpcTSkoz8IqCi4pz8vPSqjMS8dIfCQr3k/FygZEpiCUi/kYGRoa6Bia6BEVAsOT+vJDWvBGQs0ASFUWKUwEco1QIA

在这里插入图片描述

// PHP解压
$base64String = 'q1YqySzJSVWyUirJyCxWAKKCxOx8vZTUtMScklSFktTiEiUdpcTSkoz8IqCi4pz8vPSqjMS8dIfCQr3k/FygZEpiCUi/kYGRoa6Bia6BEVAsOT+vJDWvBGQs0ASFUWKUwEco1QIA';
print_r(gzinflate(base64_decode($base64String)));

在这里插入图片描述

2.后端PHP压缩+前端JS解压

// php压缩
$array = array(
	"title" 			=> "this is pako.defalte test",
	"author"			=> "slongzhang@qq.com",
	"date"				=> "2021-04-02",
	"content" 			=> "test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test"
);
function compress($str) { return base64_encode(gzdeflate($str, 9)); }
echo compress(json_encode($array,256));
// q1YqySzJSVWyUirJyCxWAKKCxOx8vZTUtMScklSFktTiEiUdpcTSkoz8IqCi4pz8vPSqjMS8dIfCQr3k/FygZEpiCUi/kYGRoa6Bia6BEVAsOT+vJDWvBGQs0ASFUWKUwEco1QIA

在这里插入图片描述

// JS解压,注意:需要引入dist/pako_inflate.js(仅支持压缩)或dist/pako.js(支持压缩和解压)
var decompress = function(str){
    return pako.inflateRaw(base64ToUint8Array(str), {to: 'string'});
}
var rawData = decompress('q1YqySzJSVWyUirJyCxWAKKCxOx8vZTUtMScklSFktTiEiUdpcTSkoz8IqCi4pz8vPSqjMS8dIfCQr3k/FygZEpiCUi/kYGRoa6Bia6BEVAsOT+vJDWvBGQs0ASFUWKUwEco1QIA');
console.log(rawData);

在这里插入图片描述

三、注意事项

1.前端JS

必须引入Uint8Array与Base64互转函数
如果不需要同时处理压缩和解压可按需单独引入脚本pako_deflate.min.js(压缩)| pako_inflate.min.js(解压);
如果需要同时处理压缩和解压那么请直接引入pako.min.js
在这里插入图片描述

2.PHP要求(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

参考资料:

1.How to convert uint8 Array to base64 Encoded String?
2.使用php-gzdeflate和pako-js
3.使用 gzip 压缩请求正文(java案例)
4.如何压缩 HTTP 请求正文(node.js+php+nginx案例)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值