【问题标题】:Decompress a json file in ReactJs在 ReactJs 中解压一个 json 文件
【发布时间】:2021-09-16 04:01:07
【问题描述】:

我已经使用 .gz 压缩在 blob 存储上存储了一个 json 文件,所以我的文件 url 看起来像这样 https://abcd.blob.core.windows.net/mydir/largefilecompressed.json.gz。所以现在我需要了解如何在 ReactJs 中获取它并解压缩到 largefilecompressed.json。

该文件是 2-3 MB 没有压缩,在低网络区域它需要时间加载并影响用户体验,这就是我想避免从服务器执行此操作的原因

【问题讨论】:

  • 我建议通过 AJAX/fetch 调用在服务器端执行此操作。
  • 正如@StephenCollins 已经提到的,您可以通过gunzip 在服务器端执行该操作,可能通过shell.exec('someSript.sh') 或类似方法(取决于操作系统和后端),然后从获取数据的前端..
  • 你不能请求部分数据吗,我怀疑你从一开始就需要全部 3MB?
  • 这不能满足您的需求吗? stackoverflow.com/questions/14620769/… 或者,为什么不在该文件前面放置一个简单的 Web 服务器,以便 Chrome 可以自动处理解压缩?
  • 使用像Pako这样的包怎么样?

标签: javascript reactjs react-redux react-hooks


【解决方案1】:

没有理由不能解压缩存储在 react 或 javascript 中的 blob。你可以解压它,使用Web-Assembly,你可以做到这一点,它几乎是本机性能。

您可以使用pako 库来完成这项工作。

从它的文档中,

inflate

使用 inflate/ungzip 和选项解压缩数据。默认情况下通过包装头自动检测格式。

这是示例代码,其中一些 json.gz 是从 github 中随机挑选的。

const urls = [
  'https://raw.githubusercontent.com/NazarHarashchak/MobileBanking/9155a04a3ff064167537a7c32f9cca356a5c3ab4/FrontEnd/node_modules/.cache/eslint-loader/b3fa51dc9159babf532b97696dacb328bf0a70dc.json.gz',
  'https://raw.githubusercontent.com/mongodb-university/mflix-python/d9667e709bd400f3d3dbd6e7f1474b3702d9d5fa/data/mflix/comments.metadata.json.gz',
  'https://raw.githubusercontent.com/dump-sauraj/realme_rmx2185_dump964/3a9c42cac2977a13e43ca8bf1ff886fca730f158/system/system/etc/protolog.conf.json.gz'
]

async function exec(i = 0) {
  console.group('file: ', i);
  try {
    // fetch file with CORS enabled
    const res = await fetch(urls[i], {
      mode: 'cors'
    });
    // convert to arrayBuffer for further processing
    const buf = await res.arrayBuffer();
    // or get blob using `await res.blob()`
    // and convert blob to arrayBuffer using `await blob.arrayBuffer()`

    console.log('input size: ', buf.byteLength);

    // decompress file
    const outBuf = pako.inflate(buf);
    console.log('output size: ', outBuf.byteLength);

    // convert arrayBuffer to string
    const str = new TextDecoder().decode(outBuf);
    // console.log('json string', str);

    // print json object
    console.log('json object', JSON.parse(str));
  } catch (err) {
    console.error('unable to decompress', err);
  }
  console.groupEnd('file: ', i);
}

async function init() {
  for (let i in urls) await exec(i)
}
init()
<script src="https://cdnjs.cloudflare.com/ajax/libs/pako/2.0.3/pako.min.js" integrity="sha512-yJSo0YTQvvGOqL2au5eH0W4K/0FI0sTJuyHjiHkh0O31Lzlb814P0fDXtuEtzOj13lOBZ9j99BjqFx4ASz9pGA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

我尝试了几个包,如wasm-flatewasm-gzipd5lypako,但只有 pako 的成功率最高。如果你觉得可以,可以考虑一下。

编辑:添加代码 cmets 并禁用完整 json 字符串的 console.log

【讨论】:

  • 谢谢。我对此表示赞同。生病测试它是否有效,我会接受它。看起来很有希望:)
  • 快点!成功。当一些成员说不可能时,我完全糊涂了。但是这个答案对我有帮助。公认。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-01-11
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
相关资源
最近更新 更多