【发布时间】:2015-03-11 06:41:17
【问题描述】:
我正在使用 Node js 和 amazon s3 服务来存储图像。我在bucket中有不同的文件夹。每个文件夹都有子文件夹。任何人都可以建议一种方法来下载原始大小的特定文件并合并为 zip 文件。 如果我可以指定图像键或 URL 并将被下载,这将很有帮助。
【问题讨论】:
标签: javascript node.js amazon-web-services amazon-s3 zip
我正在使用 Node js 和 amazon s3 服务来存储图像。我在bucket中有不同的文件夹。每个文件夹都有子文件夹。任何人都可以建议一种方法来下载原始大小的特定文件并合并为 zip 文件。 如果我可以指定图像键或 URL 并将被下载,这将很有帮助。
【问题讨论】:
标签: javascript node.js amazon-web-services amazon-s3 zip
一种方法是通过指定key和bucket信息,使用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 来执行此压缩。
【讨论】:
s3 不允许您压缩文件并下载,但它允许您在上传前压缩文件,可以单独下载。
这意味着您的下载将始终是您上传的文件的全部或部分,而不是相反。
您始终可以使用 listObjects 命令下载多个文件,其中 前缀 是您需要下载的文件,然后是每个列出的对象上的 getObject
【讨论】: