我使用Node js和amazon s3服务来存储图像。我在bucket.each文件夹中有不同的文件夹有子文件夹。任何人都可以建议一种方式来下载原始大小的特定文件组合为zip文件。 如果我可以指定图像密钥或网址,将会有所帮助。
答案 0 :(得分:1)
一种方法是通过指定密钥和存储桶信息,使用AWS-SDK包的getObject()方法获取所有图像。
您可以使用JSZip压缩图片。之后,您可以将zip保存到amazon s3并为用户提供URL或使用“fs”包保存到本地计算机。
我在这里放置我使用的示例代码
s3 = new AWS.S3({
endpoint: s3url
}),
zip = new JSZip();
function() {
var albumImages = [{"name":filename,"key":key}], // contains image key and filename
content = null;
// using async eachLimit to get images parallely
async.eachLimit(albumImages, 10, function(albumImage, next) {
var params = {
Bucket: imageBucket, // bucket name
Key: albumImage.key
};
s3.getObject(params, function(err, data) {
if (err) {
console.log('get image files err',err, err.stack); // an error occurred
} else {
zip.file(albumImages.indexOf(albumImage) + albumImage.name, data.Body);
next();
}
});
}, function(err) {
if (err) {
console.log('err', err);
} else {
content = zip.generate({
type: 'nodebuffer'
});
var params = {
Bucket: archiveBucket, // name of dest bucket
Key: 'images.zip',
Body: content
};
s3.putObject(params, function(err, data) {
if (err) {
console.log('upload zip to s3 err',err, err.stack); // an error occurred
} else {
console.log(data); // successful response
}
});
}
});
}
这里我将zip再次保存到另一个s3存储桶中。 你也可以使用aws lambda来做这个zip。
答案 1 :(得分:0)
s3不允许您压缩文件并下载,但它允许您在上传之前压缩文件,可以单独下载。
这意味着您的下载将始终是您上传的文件的全部或部分内容,而不是相反。
您始终可以使用listObjects命令下载多个文件,并使用前缀下载所需文件,然后在每个列出的对象上添加getObject