如何管存档(ZIP)到S3桶(how to pipe an archive (zip) to an

2019-11-05 03:15发布

我有点困惑与如何进行。 我使用存档(节点JS模块)作为将数据写入到一个压缩文件的装置。 目前,我有我的代码的工作,当我写到一个文件(本地存储)。

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

var output = fs.createWriteStream(__dirname + '/example.zip');
var archive = archiver('zip', {
     zlib: { level: 9 }  
});

archive.pipe(output);
archive.append(mybuffer, {name: ‘msg001.txt’});

我想,这样的归档目标文件是AWS S3桶修改代码。 综观代码示例,当我创建桶对象作为我可以指定桶里名和密钥(和身体):

var s3 = new AWS.S3();
var params = {Bucket: 'myBucket', Key: 'myMsgArchive.zip' Body: myStream};
s3.upload( params, function(err,data){
    … 
});

Or 

s3 = new AWS.S3({ parms: {Bucket: ‘myBucket’ Key: ‘myMsgArchive.zip’}});
s3.upload( {Body: myStream})
    .send(function(err,data) {
    …
    });

至于我的S3实例(S), myStream似乎是一个可读的流,我很困惑,如何尽可能使这项工作archive.pipe需要一个可写流。 这是不是我们需要使用直通流? 我发现这里有人创建了一个直通流的例子,但这个例子是过于简洁,以获得正确的认识。 我指的是具体的例子是:

管流至s3.upload()

任何帮助有人可以给我将大大赞赏。 谢谢。

Answer 1:

这可能是任何人想知道如何使用有用的pipe

既然你正确地引用使用直通流的例子,这是我工作的代码:

1 -该程序本身,压缩和解与文件节点存档器

exports.downloadFromS3AndZipToS3 = () => {
  // These are my input files I'm willing to read from S3 to ZIP them

  const files = [
    `${s3Folder}/myFile.pdf`,
    `${s3Folder}/anotherFile.xml`
  ]

  // Just in case you like to rename them as they have a different name in the final ZIP

  const fileNames = [
    'finalPDFName.pdf',
    'finalXMLName.xml'
  ]

  // Use promises to get them all

  const promises = []

  files.map((file) => {
    promises.push(s3client.getObject({
      Bucket: yourBubucket,
      Key: file
    }).promise())
  })

  // Define the ZIP target archive

  let archive = archiver('zip', {
    zlib: { level: 9 } // Sets the compression level.
  })

  // Pipe!

  archive.pipe(uploadFromStream(s3client, 'someDestinationFolderPathOnS3', 'zipFileName.zip'))

  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;
  })

  // The actual archive is populated here 

  return Promise
    .all(promises)
    .then((data) => {
      data.map((thisFile, index) => {
        archive.append(thisFile.Body, { name: fileNames[index] })
      })

      archive.finalize()
    })
  }

2 - 的辅助方法

const uploadFromStream = (s3client) => {
  const pass = new stream.PassThrough()

  const s3params = {
    Bucket: yourBucket,
    Key: `${someFolder}/${aFilename}`,
    Body: pass,
    ContentType: 'application/zip'
  }

  s3client.upload(s3params, (err, data) => {
    if (err)
      console.log(err)

    if (data)
      console.log('Success')
  })

  return pass
}


文章来源: how to pipe an archive (zip) to an S3 bucket