如何从浏览器中的 .tar.gz 文件(存储在云端)中提取数据

How do I extract data from a .tar.gz file (stored in the cloud) from a browser

问题

我正在制作一个单页应用程序,它将其数据存储在主要云提供商的 blob 存储之一(例如 goggle 云存储)中。云存储中的数据是一个 .tar.gz 文件,我想从浏览器应用程序访问它 .

在tar文件中会有数百个文件,我只想获取其中一个文件并将其渲染成HTML。我已经可以加载文件了,它只是 'how do I get the data out of it'.

不出所料,我目前在单页应用程序中使用 typescript/javascript,但如果答案是 'do it this way',那可能会改变。

我不担心浏览器的兼容性(我可以指定“仅适用于此浏览器”之类的内容),但浏览器无法访问文件系统,我无法 'shell out'操作系统

我试过的

我查找过 npm 包,最接近的是 https://github.com/npm/node-tar(但这似乎需要一个文件系统)。我相当有信心使用流,但是(在查看文档之后)感觉 zlib 不会做我想做的事 'out of the box'。我没有从 google 搜索中得到很多结果:大多数只是给出了与我相同的建议:'shell out to the operating system and have that do it with tar',但我无法在浏览器中遵循该建议

我的选择

如果这不起作用,我将放置一个 lambda/function 来执行 de-tar 环。如果可以的话,我喜欢在项目中避免 'more moving parts',但这可能是需要的。

结果应该可以通过使用 pako (a fast zlib JavaScript port) and js-untar:

的组合来实现
<script src="pako.min.js"></script>
<script src="untar.js"></script>
<script>
fetch('test.tar.gz').then(res => res.arrayBuffer()) // Download gzipped tar file and get ArrayBuffer
                    .then(pako.inflate)             // Decompress gzip using pako
                    .then(arr => arr.buffer)        // Get ArrayBuffer from the Uint8Array pako returns
                    .then(untar)                    // Untar
                    .then(files => {                // js-untar returns a list of files (See https://github.com/InvokIT/js-untar#file-object for details)
                        console.log(files);
                    });
</script>

test.tar.gz 是由 运行 tar -czvf test.tar.gz test 在一个包含 3 个文本文件的目录上创建的,以便能够检查目录和文件是否都显示在结果中。