Wondering what’s next for npm?Check out our public roadmap! »

    s3-zip

    3.2.0 • Public • Published

    s3-zip

    npm version Build Status Coverage Status JavaScript Style Guide

    Download selected files from an Amazon S3 bucket as a zip file.

    Install

    npm install s3-zip
    

    AWS Configuration

    Refer to the AWS SDK for authenticating to AWS prior to using this plugin.

    Usage

    Zip specific files

    const fs = require('fs')
    const join = require('path').join
    const s3Zip = require('s3-zip')
    
    const region = 'bucket-region'
    const bucket = 'name-of-s3-bucket'
    const folder = 'name-of-bucket-folder/'
    const file1 = 'Image A.png'
    const file2 = 'Image B.png'
    const file3 = 'Image C.png'
    const file4 = 'Image D.png'
    
    const output = fs.createWriteStream(join(__dirname, 'use-s3-zip.zip'))
    
    s3Zip
      .archive({ region: region, bucket: bucket}, folder, [file1, file2, file3, file4])
      .pipe(output)

    You can also pass a custom S3 client. For example if you want to zip files from a S3 compatible storage:

    const aws = require('aws-sdk')
    
    const s3Client = new aws.S3({
      signatureVersion: 'v4',
      s3ForcePathStyle: 'true',
      endpoint: 'http://localhost:9000',
    })
    
    s3Zip
      .archive({ s3: s3Client, bucket: bucket }, folder, [file1, file2])
      .pipe(output)

    Zip files with AWS Lambda

    Example of s3-zip in combination with AWS Lambda.

    Zip a whole bucket folder

    const fs = require('fs')
    const join = require('path').join
    const AWS = require('aws-sdk')
    const s3Zip = require('s3-zip')
    const XmlStream = require('xml-stream')
    
    const region = 'bucket-region'
    const bucket = 'name-of-s3-bucket'
    const folder = 'name-of-bucket-folder/'
    const s3 = new AWS.S3({ region: region })
    const params = {
      Bucket: bucket,
      Prefix: folder
    }
    
    const filesArray = []
    const files = s3.listObjects(params).createReadStream()
    const xml = new XmlStream(files)
    xml.collect('Key')
    xml.on('endElement: Key', function(item) {
      filesArray.push(item['$text'].substr(folder.length))
    })
    
    xml
      .on('end', function () {
        zip(filesArray)
      })
    
    function zip(files) {
      console.log(files)
      const output = fs.createWriteStream(join(__dirname, 'use-s3-zip.zip'))
      s3Zip
       .archive({ region: region, bucket: bucket, preserveFolderStructure: true }, folder, files)
       .pipe(output)
    }

    Tar format support

    s3Zip
      .setFormat('tar')
      .archive({ region: region, bucket: bucket }, folder, [file1, file2])
      .pipe(output)

    Zip a file with protected password

    s3Zip
      .setRegisterFormatOptions('zip-encrypted', require("archiver-zip-encrypted"))
      .setFormat('zip-encryptable')
      .setArchiverOptions({zlib: {level: 8}, encryptionMethod: 'aes256', password: '123'})
      .archive({ region: region, bucket: bucket }, folder, [file1, file2])
      .pipe(output)

    Archiver options

    We use archiver to create archives. To pass your options to it, use setArchiverOptions method:

    s3Zip
      .setFormat('tar')
      .setArchiverOptions({ gzip: true })
      .archive({ region: region, bucket: bucket }, folder, [file1, file2])

    Organize your archive with custom paths and permissions

    You can pass an array of objects with type EntryData to organize your archive.

    const files = ['flower.jpg', 'road.jpg']
    const archiveFiles = [
      { name: 'newFolder/flower.jpg' },
    
      /* _rw_______ */
      { name: 'road.jpg', mode: parseInt('0600', 8)  }
    ];
    s3Zip.archive({ region: region, bucket: bucket }, folder, files, archiveFiles)

    Using with ExpressJS

    s3-zip works with any framework which leverages on NodeJS Streams including ExpressJS.

    const s3Zip = require('s3-zip')
    
    app.get('/download', (req, res) => {
      s3Zip
        .archive({ region: region, bucket: bucket }, '', 'abc.jpg')
        .pipe(res)
    })

    Above should stream out the file in the response of the request.

    Debug mode

    Enable debug mode to see the logs:

    s3Zip.archive({ region: region, bucket: bucket, debug: true }, folder, files)

    Testing

    Tests are written in Node Tap, run them like this:

    npm t
    

    If you would like a more fancy coverage report:

    npm run coverage
    

    Install

    npm i s3-zip

    DownloadsWeekly Downloads

    13,289

    Version

    3.2.0

    License

    MIT

    Unpacked Size

    25.5 kB

    Total Files

    16

    Last publish

    Collaborators

    • avatar