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

bwleehnv  于 2023-02-03  发布在  Node.js
关注(0)|答案(1)|浏览(147)

我尝试在我的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)有其他想法来实现我的目标?
先谢了。

soat7uwm

soat7uwm1#

您不需要用途: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);

});

相关问题