Как разархивировать в PHP данные, ранее заархивированные в JavaScript

Я пытаюсь сжать строку JSON pako и отправьте его в PHP-скрипт (Laravel) и распакуйте его, затем измените, снова сожмите и отправьте обратно клиенту.

Когда я сжимаю и распаковываю в клиенте, он работает отлично; но когда я отправляю сжатые данные с клиента на сервер, он показывает мне:

Msgstr "Ошибка исключения (E_WARNING) gzdecode(): ошибка данных".

я пробовал gzinflate, gzumcompress, gzuncompress ТАК, zlib а также pako официальная документация, но ничего не работает.

Код клиента:

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 ответа

Вам нужно использовать gzdecode(), Это функция PHP, которая распаковывает потоки gzip.

gzuncompress() для потоков ZLIB, и gzinflate() для потоков сырой дефлят. Я понятия не имею, почему авторы PHP помещают "gz" в имена этих функций, если они не думают, что было бы смешно сознательно вводить пользователей в заблуждение.

Пример строки base64, которую вы указали в вопросе, декодируется в допустимый поток gzip. Таким образом, ваши данные были правильно сжаты и перешли на сервер в целости и сохранности. gzip_decode(base64_decode(that)) должно сработать. Вы уверены, что $request->output это строка?

Вы просто меняете код:

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

к

      var output = pako.gzip(input);

The {to: 'string'}опция будет преобразована из строки utf8 в строку utf16 (javascript). @см.: https://nodeca.github.io/pako/#inflate

Другие вопросы по тегам