我正在尝试在我的亚马逊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)有另一个想法来实现我的目标?
提前致谢。
你不需要使用: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);
});