如何让 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
我正在从 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