【问题标题】:How to unzip in PHP the data previously zipped in JavaScript如何在 PHP 中解压缩之前在 JavaScript 中压缩的数据
【发布时间】:2019-06-15 07:39:00
【问题描述】:

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

当我在客户端压缩和解压缩时,它工作得很好;但是当我将压缩数据从客户端发送到服务器时,它会显示:

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

我已经尝试过gzinflategzumcompressgzuncompressSOzlibpako 官方文档,但没有任何效果。

客户端代码

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
}

【问题讨论】:

  • 你为什么要压缩它?无论如何,Web 服务器和浏览器都应该为您执行此操作,只要它们配置正确(通常自动开启)。
  • @Kurucu 因为正在将数据从浏览器向上发送到服务器,而不是相反。
  • @Mirko 啊,是的。应该更加关注。

标签: php laravel zlib pako


【解决方案1】:

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

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

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

【讨论】:

  • 已经尝试使用 gzdecode (),它也显示数据错误
  • 你应该在 PHP 端发布一个小例子来说明你给base64_decode 的内容。
  • 感谢您的关注,并使用输入示例编辑代码
  • 示例在服务器代码中,我添加了注释行
  • 啊,对不起。我错过了。
【解决方案2】:

你只需更改代码:

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

var output = pako.gzip(input);

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

【讨论】:

    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    相关资源
    最近更新 更多