将.sip文件作为.zip发送,作为Express.js中的响应

问题描述 投票:0回答:1

我正在尝试在我的亚马逊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)有另一个想法来实现我的目标?

提前致谢。

node.js express amazon-s3
1个回答
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);

});
© www.soinside.com 2019 - 2024. All rights reserved.