// java压缩后通过base64编码返回前端, 下面方法仅为压缩方法
private static byte[] compress(byte[] inputByte) throws IOException {
int len = 0;
Deflater defl = new Deflater();
defl.setInput(inputByte);
defl.finish();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] outputByte = new byte[1024];
try {
while (!defl.finished()) {
// 压缩并将压缩后的内容输出到字节输出流bos中
len = defl.deflate(outputByte);
bos.write(outputByte, 0, len);
}
defl.end();
} finally {
bos.close();
}
return bos.toByteArray();
}
// js解压缩, 通过js-base64 和pako.js来解压缩还原数据
// js-base64 和pako.js 需要自行搜索
let str = res.msg,
decode64Str = Base64.atob(str),
charData = decode64Str.split('').map(function(x) { return x.charCodeAt(0) }),
binData = new Uint8Array(charData),
pakoData = pako.inflate(binData),
result = String.fromCharCode.apply(null, new Uint16Array(pakoData)),
resultData = JSON.parse(decodeURI(result)) // 这里是最后解压出来的数据// 如果js报出了Maximum call stack size 堆栈溢出的错误, 则可以把String.fromCharCode.apply方法替换为如下方法:
function handleCodePoints(array) {
var CHUNK_SIZE = 0x8000; // arbitrary number here, not too small, not too big
var index = 0;
var length = array.length;
var result = '';
var slice;
var arr = [];
for (var i = 0, _i = array.length; i < _i; i++) {
arr[i] = array[i];
}
while (index < length) {
slice = arr.slice(index, Math.min(index + CHUNK_SIZE, length)); // `Math.min` is not really necessary here I think
result += String.fromCharCode.apply(null, slice);
index += CHUNK_SIZE;
}
return result;
}