javascript - '没有这样的文件或目录':从 S3 下载多个文件
问题描述
我有一个 API 方法,当调用并传递一串文件密钥时,将其转换为数组,然后从 S3 下载它们。但是,当我调用此 API 时,我Error: ENOENT: no such file or directory, open <filename here>
在服务器上收到错误消息。
这是我的api:
reports.get('/xxx/:fileName', async (req, res) => {
var AWS = require('aws-sdk');
var s3 = new AWS.S3();
var str_array = req.params.fileName.split(',');
for (var i = 0; i < str_array.length; i++) {
var filename = str_array[i].trim();
localFileName = './' + filename;
let file = fs.createWriteStream(localFileName);
s3.getObject({
Bucket: config.reportBucket,
Key: filename
})
.on('error', function (err) {
res.end("File download failed with error " + err.message);
})
.on('httpData', function (chunk) {
file.write(chunk);
})
.on('httpDone', function () {
file.end();
})
.send();
}
res.end("Files have been downloaded successfully")
});
如何通过传递我的密钥数组从 S3 成功下载多个文件?
解决方案
您需要更详细地了解要求。我的意思是用例是什么,您要下载的所有 S3 文件是否有任何公共前缀,大小是否有任何限制等。下面的代码使用 java aws-s3-sdk 1.11.136。我正在下载该位置存在的所有对象。请注意,这是进行多次调用(不建议)。
public void downloadMultipleS3Objects(String[] objectPaths){
Arrays.stream(objectPaths)
.filter(objectPath -> amazonS3.doesObjectExist("BUCKET_NAME",objectPath))
.forEach(objectPath -> amazonS3.getObject("BUCKET_NAME", objectPath).getObjectContent())})};// todo you may write this stream to a file
注意:如果您对所有对象都有一个共同的前缀,那么还有其他 API 可以更好地实现这一点。