$ /tutorials

Archiver reading zip data as a buffer without writing to filesystem

published · 1 minute read · nodejs zip
Archiver reading zip data as a buffer without writing to filesystem

Zip data from buffer without writing to filesystem with the Node.js module archiver. All the examples offered in the description of Archiver NPM Module explains how to create a Zip writing to a file. But if you need to write to a stream and return that stream as a buffer, here is an example.

Util function

import archiver from 'archiver'
import { Writable } from 'stream'

/**
 * @param {array<{data: Buffer, name: String}>} files
 * @returns {Promise<Buffer>}
 */
function zipFiles (files) {
  return new Promise((resolve, reject) => {
    const buffs = []

    const converter = new Writable()

    converter._write = (chunk, encoding, cb) => {
      buffs.push(chunk)
      process.nextTick(cb)
    }

    converter.on('finish', () => {
      resolve(Buffer.concat(buffs))
    })

    const archive = archiver('zip', {
      zlib: { level: 9 }
    })

    archive.on('error', err => {
      reject(err)
    })

    archive.pipe(converter)

    for (const file of files) {
      archive.append(file.data, { name: file.name })
    }

    archive.finalize()
  })
}

Usage

const files = [
    ...
    {
        data: Buffer.from('just a buf'),
        name: 'file.txt'
    },
    ...
]

const zipBuffer = zipFiles(files)