如何让 Google Cloud Storage 解压缩 gzip 文件?

How do I make Google Cloud Storage unzip a gzipped file?

我正在从 FTP 服务器检索 gzip 压缩的 csv 文件并将其存储在 Google 云存储中。我需要另一个 GCP 服务 Dataprep 来读取这个文件。 Dataprep 仅适用于 csv,无法即时解压缩。

那么,正确的解压缩方法是什么?这是我的代码:

import FTPClient from 'ftp'

const file = bucket.file(path)

var ftpServer = new FTPClient()
ftpServer.on('ready', () => {
  ftpServer.get('/file.gz', (err, stream) => {
    if (err) throw err
    stream.once('close', () => {
      ftpServer.end()
      resolve(true)
    })
    stream.pipe(
      file.createWriteStream({
        resumable: false,
        public: false,
        gzip: true
      })
    )
  })
})
ftpServer.connect({
  host: 'somehost.com',
  user: 'user',
  password: '******'
})

我看过this question。我不确定这是否是最佳解决方案。据我了解,该代码将读取文件,将其加载到我的服务器内存中,然后将其写回。这似乎是对内存和流量的巨大浪费。有没有更好的解压方法?

想通了。我用 zlib.

import zlib from 'zlib'

...
const unzipper = zlib.createGunzip()
stream.pipe(unzipper).pipe(
  file.createWriteStream({
    resumable: false,
    public: false,
    gzip: true
  })
)
...

我认为您不需要存储解压后的文件。您需要设置正确的内容类型和内容编码(使用 gzip: true 选项自动设置为 gzip,类似于


 stream.pipe(
      file.createWriteStream({
        contentType: 'text/plain',
        resumable: false,
        public: false,
        gzip: true
      })
    )

如果请求者未在 header 中设置 header Accept-encoding: gzip,文件将以未压缩的形式提供。这是described in the documentation