[googlegun存储对象上的creategunzip()

问题描述 投票:0回答:1

因此,我正在将JSON格式的备份文件上传到Google云存储分区。服务器是NodeJS。为了节省空间,我想在上传之前先压缩文件。

我上传文件的功能是:

    const bufferStream = new stream.PassThrough()
    bufferStream.end(Buffer.from(req.file.buffer, 'utf8'))
    const bucket = storage.bucket('backups')
    const filename = 'backup.json.gz'
    const file = bucket.file(filename)
    const writeStream = file.createWriteStream({
        metadata: {
            contentType: 'application/json',
            contentEncoding: 'gzip'
        },
        validation: "md5"
    })
    bufferStream.pipe(zlib.createGzip()).pipe(writeStream).on('finish', async () => {
        return res.status(200).end()
    })  

此功能有效。下载时我在解压缩时遇到问题。我的功能是:

    const bucket = storage.bucket('backups')
    let backup = ''
    const readStream = bucket.file('backup.json.gz').createReadStream()
    readStream.pipe(zlib.createGunzip()) // <-- here
    readStream.on('data', (data) => {
        backup += data
    })
    readStream.on('end', () => {
        res.status(200).send(backup).end()
    })

使用下载功能时,出现以下错误:

Error: incorrect header check
Errno: 3
code: Z_DATA_ERROR

当我只删除createGunzip()函数时,一切正常!我什至可以读取文件的内容,但是由于某种原因,我认为这可能不是理想的解决方案。现在,为了进行测试,我将文件的最大文件大小为50kB,但在生产中可能会获得文件> 10Mb。

createGunzip()函数是否需要缓冲区?还是还有其他问题?

谢谢!

node.js google-cloud-storage zlib
1个回答
0
投票

根据the documentation,如果将对象压缩并正确上传,那么返回的对象将被自动解压缩,这就是为什么在您的情况下不需要压缩拉链的原因。

如果您想原样接收文件,则您的请求中应包含Accept-Encoding: gzip标头。

© www.soinside.com 2019 - 2024. All rights reserved.