Прочитайте файл xz на стороне клиента - PullRequest
0 голосов
/ 28 августа 2018

У меня на сервере большие файлы json, которые я сжал xz. Я подумал, что будет хорошей идеей запросить их как таковые, то есть сжать, и распаковать их в javascript на стороне клиента. Я пытаюсь использовать библиотеку LZMA-JS , но мне не удалось заставить ее работать.

Вот соответствующий фрагмент HTML:

<script src="jquery-3.3.1.min.js"></script>
<script src="lzma-d-min.js"></script>
<script src="main.js"></script>

А вот соответствующая часть main.js:

$.ajax({
  type: 'POST',
  processData: false,
  contentType: false,
  url: file_name+'.json.xz',
  beforeSend: function() { element.prop("disabled", true); },
  success: function(xz) {
    // http://cdn.jwebsocket.org/lzma-js/1.3.7/demos/simple_demo.html
    console.log(xz); // 1
    LZMA.decompress(xz,
      function on_finish(result, error) {
        console.log(result); // 2
        console.log(error); // 3
        data = JSON.parse(result);
      },
      function on_progress(percent) { }
    );
    element.prop("disabled", false);
  }
});

Первый console.log правильно печатает содержимое файла, по крайней мере, судя по магическим числам �7zXZ. Второй печатает null, а третий печатает это:

Error: corrupted input
    at y (lzma-d-min.js:1)
    at L (lzma-d-min.js:1)
    at t (lzma-d-min.js:1)

Не правильно ли я использую библиотеку? Я могу распаковать файлы без проблем, используя xz в Linux, lzma в python3 или boost::iostreams::lzma_decompressor в C ++. Я не смог найти другую библиотеку JavaScript, чтобы попробовать.

Я открыт для предложений, использующих другой формат сжатия.

1 Ответ

0 голосов
/ 28 августа 2018

Вы смешиваете форматы.

XZ - это формат архива. LZMA является основным компрессором потока. LZMA-JS может распаковывать только поток LZMA, но не архив XZ.

Используйте инструмент командной строки lzma для создания необработанного потока LZMA.

...