在客户端读取 xz 文件

Posted

技术标签:

【中文标题】在客户端读取 xz 文件【英文标题】:Read xz file on client side 【发布时间】:2018-08-28 05:55:40 【问题描述】:

我在服务器上有大型 json 文件,我用xz 压缩了这些文件。我认为这样请求它们是个好主意,即压缩它们,然后在客户端用javascript解压缩它们。我正在尝试使用 LZMA-JS 库,但我无法让它工作。

这里是相关的 html sn-p:

<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)

我没有正确使用库吗? 我可以在 Linux 上使用 xz 或在 python3 中使用 lzma 或在 C++ 中使用 boost::iostreams::lzma_decompressor 解压缩相关文件而不会出现问题。我找不到要尝试的其他 JavaScript 库。

我愿意接受使用不同压缩格式的建议。

【问题讨论】:

console.log(xz.length); 看起来完全正确吗? 有趣的是没有。 wc -c 表示 65748,但 console.log 表示 62245。我现在正在尝试使用小文件。 Encoding... 尝试将文件下载为 ArrayBuffer。甚至在 github 自述文件上说 decompress 需要一个 ByteArray,而不是 utf16 字符串 是的,我看到它这么说,但我不知道该怎么做。我该怎么做? 我会说fetch(file_name+'.json.xz').then(r=&gt;r.arrayBuffer()).then(buf=&gt; LZMA.decompress(new Uint8Array(buf)...?或者使用 XHR 将是 xhr.open('get', file_name+'.json.xz'); xhr.responseType="arrayBuffer"; xhr.onload = e =&gt; LZMA.decompress(new Uint8Array(xhr.result),... 但也许他们甚至直接接受裸 ArrayBuffer,我不确定... 【参考方案1】:

你在混淆格式。

XZ 是一种存档格式。 LZMA 是底层流压缩器。 LZMA-JS 只能解压 LZMA 流,不能解压 XZ 存档。

使用lzma 命令行工具创建原始 LZMA 流。

【讨论】:

以上是关于在客户端读取 xz 文件的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中从 S3 读取 .xz 文件

在 GWT 的客户端读取文件

在客户端用 JavaScript 逐行读取文件

如何在客户端读取excel文件内容?

如何在客户端读取excel文件内容?

如何在最短的时间内读取 1TB 压缩文件 [关闭]