后端返回数据量过大,通过前端Pako.js 压缩/解压库 与 Java 的 Gzip base64 压缩与解压 的互通实现

3 篇文章 0 订阅
1 篇文章 0 订阅
该博客介绍了如何在Java中使用Gzip进行压缩,并结合Base64编码进行数据的编码与解码。提供了一个名为`ZipUtil`的静态类,包含`CompressToBase64`和`DecompressToBase64`两个方法,分别用于字符串的压缩和解压。同时,展示了前端如何使用pako库对数据进行解压。
摘要由CSDN通过智能技术生成

Java Gzip - base64压缩和解压
 

public final class ZipUtil
{
    public static String CompressToBase64(String string){
        try {
            ByteArrayOutputStream os = new ByteArrayOutputStream(string.length());
            GZIPOutputStream gos = new GZIPOutputStream(os);
            gos.write(string.getBytes());
            gos.close();
            byte[] compressed = os.toByteArray();
            os.close();
 
 
            String result = Base64.encodeToString(compressed, Base64.DEFAULT);
            return result;
        } catch (IOException e) {
            e.printStackTrace();
 
 
 
 
        }
        catch (Exception ex){
 
 
        }
        return "";
    }
 
 
    public static String DecompressToBase64(String textToDecode){
        //String textToDecode = "H4sIAAAAAAAAAPNIzcnJBwCCidH3BQAAAA==\n";
        try {
            byte[] compressed = Base64.decode(textToDecode, Base64.DEFAULT);
            final int BUFFER_SIZE = 32;
            ByteArrayInputStream inputStream = new ByteArrayInputStream(compressed);
 
 
            GZIPInputStream gis  = new GZIPInputStream(inputStream, BUFFER_SIZE);
 
 
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] data = new byte[BUFFER_SIZE];
            int bytesRead;
            while ((bytesRead = gis.read(data)) != -1) {
                baos.write(data, 0, bytesRead);
            }
 
 
            return baos.toString("UTF-8");
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        catch (Exception ex){
 
 
        }
        return "";
    }
}

前端:

下载与引入pako

下载:npm install pako

引入:import pako from "pako"
 


function arrayBufferToString(buffer){
  var bufView = new Uint16Array(buffer);
  var length = bufView.length;
  var result = '';
  var addition = Math.pow(2,16)-1;
  for(var i = 0;i<length;i+=addition){
  if(i + addition > length){
  addition = length - i;
  }
  result += String.fromCharCode.apply(null, bufView.subarray(i,i+addition));
  }
  return result;
  }
// b64Data-->传入加密的数据进行解密
function unzip (b64Data) {
  let strData = atob(b64Data)
  // 将二进制字符串转换为字符数数组
  const charData = strData.split('').map(function (x) { return x.charCodeAt(0) })
  // 将数字数组转换为字节数组
  const binData = new Uint8Array(charData)
  // // unzip
  const data = pako.inflate(binData)
  // 将gunzipped byteArray转换回ascii字符串:
  strData = arrayBufferToString(new Uint16Array(data))
  return decodeURIComponent(escape(strData))
}
// 加密
function zip (str) {
  if (typeof str !== 'string') {
    str = JSON.stringify(str)
  }
  const binaryString = pako.gzip(str, { to: 'string' })
  return btoa(binaryString)
}

export {
  unzip,
  zip
}

在页面中导入
import { unzip } from '@/utils/pako'

使用:
this.data = JSON.parse(unzip(res.message))
 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java后端和浏览器中使用Pako.js实现Gzip压缩解压方法是不同的。 浏览器端: 压缩: ``` var buffer = new Uint8Array(inputString.length); for (var i = 0; i < inputString.length; i++) { buffer[i] = inputString.charCodeAt(i); } var compressed = pako.gzip(buffer); var outputString = String.fromCharCode.apply(null, new Uint16Array(compressed)); ``` 解压: ``` var compressed = new Uint8Array(inputString.length); for (var i = 0; i < inputString.length; i++) { compressed[i] = inputString.charCodeAt(i); } var decompressed = pako.inflate(compressed); var outputString = String.fromCharCode.apply(null, new Uint16Array(decompressed)); ``` 与在浏览器端相同,我们首先将输入字符串转换为一个Uint8Array,然后使用Pako.jsgzip函数将其压缩。最后,我们将压缩后的结果转换回字符串形式。 在解压的过程中,我们将输入字符串转换为Uint8Array,然后使用Pako.js的inflate函数将其解压,最后将结果转换回字符串形式。 需要注意的是,最后转换为字符串时要使用Uint16Array而不是Uint8Array,这是因为JavaScript中的字符串是基于UTF-16编码的。 Java后端Java后端可以使用Java版的Pako实现Gzip压缩解压。 引入Java版的Pako: ``` <dependency> <groupId>io.github.azagniotov</groupId> <artifactId>pako-java</artifactId> <version>1.0.1</version> </dependency> ``` 压缩: ``` String inputString = "input string"; byte[] inputBytes = inputString.getBytes(StandardCharsets.UTF_8); byte[] compressedBytes = new Deflater().deflate(inputBytes); String outputString = new String(compressedBytes, StandardCharsets.ISO_8859_1); ``` 解压: ``` byte[] compressedBytes = inputString.getBytes(StandardCharsets.ISO_8859_1); Inflater inflater = new Inflater(); inflater.setInput(compressedBytes); byte[] buffer = new byte[1024]; ByteArrayOutputStream outputStream = new ByteArrayOutputStream(compressedBytes.length); while (!inflater.finished()) { int count = inflater.inflate(buffer); outputStream.write(buffer, 0, count); } outputStream.close(); byte[] decompressedBytes = outputStream.toByteArray(); String outputString = new String(decompressedBytes, StandardCharsets.UTF_8); ``` 在Java中,我们使用Deflater类的deflate方法进行压缩,使用Inflater类进行解压。需要注意的是,在解压的过程中,我们需要使用一个字节输出流ByteArrayOutputStream来存储解压后的字节,最后再将其转换为字符串形式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值