Build Status Build status

a streaming interface for archive generation

Visit the API documentation for a list of all methods available.


npm install archiver --save

Quick Start

// require modules
var fs = require('fs');
var archiver = require('archiver');

// create a file to stream archive data to.
var output = fs.createWriteStream(__dirname + '/');
var archive = archiver('zip', {
  zlib: { level: 9 } // Sets the compression level.

// listen for all archive data to be written
// 'close' event is fired only when a file descriptor is involved
output.on('close', function() {
  console.log(archive.pointer() + ' total bytes');
  console.log('archiver has been finalized and the output file descriptor has closed.');

// This event is fired when the data source is drained no matter what was the data source.
// It is not part of this library but rather from the NodeJS Stream API.
// @see:
output.on('end', function() {
  console.log('Data has been drained');

// good practice to catch warnings (ie stat failures and other non-blocking errors)
archive.on('warning', function(err) {
  if (err.code === 'ENOENT') {
    // log warning
  } else {
    // throw error
    throw err;

// good practice to catch this error explicitly
archive.on('error', function(err) {
  throw err;

// pipe archive data to the file

// append a file from stream
var file1 = __dirname + '/file1.txt';
archive.append(fs.createReadStream(file1), { name: 'file1.txt' });

// append a file from string
archive.append('string cheese!', { name: 'file2.txt' });

// append a file from buffer
var buffer3 = Buffer.from('buff it!');
archive.append(buffer3, { name: 'file3.txt' });

// append a file
archive.file('file1.txt', { name: 'file4.txt' });

// append files from a sub-directory and naming it `new-subdir` within the archive'subdir/', 'new-subdir');

// append files from a sub-directory, putting its contents at the root of archive'subdir/', false);

// append files from a glob pattern

// finalize the archive (ie we are done appending files but streams have to finish yet)
// 'close', 'end' or 'finish' may be fired right after calling this method so register to them beforehand


Archiver ships with out of the box support for TAR and ZIP archives.

You can register additional formats with registerFormat.

Formats will be changing in the next few releases to implement a middleware approach.


3.1.1 - August 2, 2019Diff

  • update zip-stream to v2.1.2

3.1.0 - August 2, 2019Diff

  • update zip-stream to v2.1.0

3.0.3 - July 19, 2019Diff

  • test: now targeting node v12
  • other: update zip-stream@2.0.0

3.0.2 - July 19, 2019Diff

  • other: update dependencies

3.0.1 - July 19, 2019Diff

  • other: update dependencies
  • docs: now deployed using netlify

3.0.0 - August 22, 2018Diff

  • breaking: follow node LTS, remove support for versions under 6. (#339)
  • bugfix: use stats in tar.js and core.js (#326)
  • other: update to archiver-utils@2 and zip-stream@2
  • other: remove lodash npm module usage (#335, #339)
  • other: Avoid using deprecated Buffer constructor (#312)
  • other: Remove unnecessary return and fix indentation (#297)
  • test: now targeting node v10 (#320)

2.1.1January 10, 2018Diff

  • bugfix: fix relative symlink paths (#293)
  • other: coding style fixes (#294)

2.1.0October 12, 2017Diff

  • refactor: directory now uses glob behind the scenes. should fix some directory recursion issues. (#267, #275)
  • docs: more info in quick start. (#284)

2.0.3August 25, 2017Diff

  • bugfix: revert #261 due to potential issues with editing entryData in special cases.
  • bugfix: add var to entryData in glob callback (#273)

2.0.2August 25, 2017Diff

  • docs: fix changelog date.

2.0.1August 25, 2017Diff

  • bugfix: add const to entryData in glob callback (#261)
  • other: coding style fixes (#263)

2.0.0July 5, 2017Diff

  • feature: support for symlinks. (#228)
  • feature: support for promises on finalize. (#248)
  • feature: addition of symlink method for programmatically creating symlinks within an archive.
  • change: emit warning instead of error when stat fails and the process can still continue.
  • change: errors and warnings now contain extended data (where available) and have standardized error codes (#256)
  • change: removal of deprecated bulk functionality. (#249)
  • change: removal of internal _entries property in favor of progress event. (#247)
  • change: support for node v4.0+ only. node v0.10 and v0.12 support has been dropped. (#241)

1.3.0December 13, 2016Diff

  • improve directory and glob methods to use events rather than callbacks. (#203)
  • fix bulk warning spam (#208)
  • updated mocha (#205)

1.2.0November 2, 2016Diff

  • Add a process.emitWarning for deprecated (#202)

1.1.0August 29, 2016Diff

  • minor doc fixes.
  • bump deps to ensure latest versions are used.

1.0.1July 27, 2016Diff

  • minor doc fixes.
  • dependencies upgraded.

1.0.0April 5, 2016Diff

  • version unification across many archiver packages.
  • dependencies upgraded and now using semver caret (^).

0.21.0December 21, 2015Diff

  • core: add support for entry.prefix. update some internals to use it.
  • core(glob): when setting options.cwd get an absolute path to the file and use the relative path for #173
  • core(bulk): soft-deprecation of bulk feature. will remain for time being with no new features or support.
  • docs: initial jsdoc for core.
  • tests: restructure a bit.

0.20.0November 30, 2015Diff

  • simpler path normalization as path.join was a bit restrictive. #162
  • move utils to separate module to DRY.

Release Archive