如何用PHP解压缩先前用JavaScript压缩的数据

时间:2019-01-21 21:30:50

标签: php laravel zlib pako

我正在尝试使用pako压缩JSON字符串,并将其发送到PHP脚本(Laravel),然后对其进行解压缩,然后对其进行修改,再次进行压缩,然后将其发送回客户端。

当我在客户端中压缩和解压缩时,它可以完美工作;但是当我将压缩数据从客户端发送到服务器时,它显示了我

  

“ ErrorException(E_WARNING)gzdecode():数据错误”。

我已经尝试过gzinflategzumcompressgzuncompressSOzlibpako的官方文档,但是没有用。 / p>

客户代码

var pako = require('pako');
// convert JSON to string 
var input = JSON.stringify(vm.exceltojson);
// compressing input
var output = pako.gzip(input, {to: 'string'});
output = btoa(output);
var data = [{output: output}];
// send data to server
HTTP.post(apivalida_per, data)
    .then(response => {
      vm.persona_planilla = response.data.data;
    });

服务器代码

public function getgzip(Request $request)
{
  // here I get the error: gzinflate() data error
  // Example of input on base64 H4sIAAAAAAAAA12SUUvDMBSF/4r0WVw7N9fubU5lheFkqA8TCbdJ1l1Zc0PSyED87960KwyfSr5zzj23TT9+EuMomWfXidVOSEzm02KW380mAxD6ZLVCxaZk/ZL0GKw+HpkJ67DRcUCyWG6Wq3Jb/nd4XQfTpZfbt91ZNdRUTnuG27fX1dVD+fy43i3O4l7LAwgDEhvUpo3R22yUTkdZkRdnjwWM6fvNunwvh6DXp2h+4qOygmSwPINMrCbjw7El10t9A5qad4iJLB+l2WicZkWvH8iB544aFHBN3kGFzFoHFXyBIsbjrDdDxd0VeJQ8azpN0w5XZEiAabEOWoFi+6VgHakg++167EPlUSGJvSPTageDECv5EvhBTqEBxx5Dsg3O0ODhVUkoatCghONAqXXkuz4/ICcFfvPo2XhyM5lduJT2MsSv3Vt1YwWq7r8IXjtUAlp+hd/PP5f0W64xAgAA

  $string = gzdecode(base64_decode($request->output));
  return $string;
  // ---here is more code, but i want first uncompress de JSON
}

2 个答案:

答案 0 :(得分:0)

您需要使用gzdecode()。那就是解压缩gzip流的PHP函数。

gzuncompress()用于zlib流,gzinflate()用于原始deflate流。我不知道为什么PHP作者会在这些函数名中加上“ gz”,除非他们认为故意混淆用户会很有趣。

您在问题中提供的示例base64字符串将解码为有效的gzip流。因此,您的数据已正确压缩,并毫发无损地传输到服务器。 gzip_decode(base64_decode(that))应该可以。您确定$request->output是该字符串吗?

答案 1 :(得分:0)

您只需更改代码:

var output = pako.gzip(input, {to: 'string'});

var output = pako.gzip(input);

{to: 'string'} 选项将从 utf8 转换为 utf16 (javascript) 字符串。 @see:https://nodeca.github.io/pako/#inflate