在Express.js中以SIP格式发送S3文件作为响应

时间:2019-03-10 18:54:29

标签: node.js express amazon-s3

我正在尝试在Amazon S3主存储桶中发送某些项目的zip文件,并带有对HTTP请求的响应。由于我对express.js相当陌生,并且没有看到任何手动的特定方法,因此我使用的是s3-zip,它没有关于如何在响应中发送文件的特定说明,而是输出它在目录中:

const output = fs.createWriteStream(join(__dirname, 'use-s3-zip.zip'))

s3Zip
  .archive({ region: region, bucket: bucket}, folder, [file1, file2, file3, file4])
  .pipe(output)

这是我对代码的略微改动:

app.get('/files', (request, response) => {
  const objectIds = request.body.objectIds
  const folder = request.body.folder

  response.set('content-type', 'application/zip')

  s3Zip
    .archive({ s3: s3, bucket: aws_bucket_name }, folder, objectIds)
    .pipe(response)

  s3Zip.on('end', () => {
    console.log('ended');
    response.end();
  })
});

但是,未定义s3Zip.on。

有人1)曾经以这种方式使用过这种依赖关系,并且可以指出如何使其起作用吗?2)还有另一个想法可以实现我的目标?

谢谢。

1 个答案:

答案 0 :(得分:0)

您不需要使用:response.end().pipe将解决此问题。

s3Zip没有.on方法,但是由s3Zip.archive创建的流

app.get('/files', (request, response) => {
  const objectIds = request.body.objectIds
  const folder = request.body.folder

  response.set('content-type', 'application/zip')

  s3Zip
    .archive({ s3: s3, bucket: aws_bucket_name }, folder, objectIds)
    .pipe(response)

});

app.get('/files', (request, response) => {
  const objectIds = request.body.objectIds
  const folder = request.body.folder

  response.set('content-type', 'application/zip')

  const archive = s3Zip
    .archive({ s3: s3, bucket: aws_bucket_name }, folder, objectIds)


  archive.on('error', (e) => {
     res.status(500).send(e.message);
  });

  archive.on('end', () => {
     console.log('archive created');
  });

  archive.pipe(response);

});