我正在尝试在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)还有另一个想法可以实现我的目标?
谢谢。
答案 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);
});