上一篇文章我们介绍了PHP压缩功能的使用php 压缩图片,但只讲了服务相关的应用。 今天我们结合后端来实现数据压缩传输。
服务器通常会对客户端上传的数据进行限制,例如:限制请求体的大小、限制key的数量等。
如果我们压缩数据并将其发送回服务器,我们可以避免许多限制。
今天我们就结合后端来练习数据压缩和传输!
服务器压缩:
服务器压缩功能共有三种。 如果不明白的话可以看我之前的文章【PHP压缩函数总结及实际应用】。 这是 [gzinflate] 的示例:
base64_encode(gzdeflate('待压缩的内容'))
注意:要压缩的内容必须是字符串,并且压缩后的内容必须经过base64编码,防止出现其他问题
由于服务器返回的数据是base64格式的,所以我们需要解码base64:
// 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;
}
Base64解码后,可以使用[pako]解压。 前端需要安装[pako]扩展:
npm install pako
安装解压扩展后,我们可以使用[pako]来解压:
pako.inflateRaw(base64ToUint8Array(res.data.description),{to:'string'})
前端压缩数据
上面我们已经实现了服务器端压缩数据php 压缩图片,客户端解压数据。 但客户端还没有实现数据压缩,服务器对数据进行解压。
首先使用[pako]对压缩数据进行扩展:
pako.deflateRaw('压缩的内容', {to:'string'})
获取压缩数据后,将数据转换为base64格式,并以base64格式上传数据:
// uint8array转为base64字符串
function uint8arrayToBase64(u8Arr) {
return window.btoa(u8Arr);
}
//数据压缩并将压缩后的内容转base64编码
uint8arrayToBase64(pako.deflateRaw('压缩内容', {to:'string'}))
服务器解压
该服务接受base64格式的数据,因此我们需要先对其进行基本解码,然后再解压缩数据:
gzinflate(base64_decode('客户端数据'))
最后将数据存储在服务中,这就完成了服务端和后端的结合,实现数据的压缩和解压
如有遗漏或错误,请在我的公众号留言。