如何使用 imgURL 一次从 Amazon S3 检索多个图像?
How to retrieve multiple image from Amazon S3 using imgURL at once?
我想根据图像 URL.
从 Amazon S3 一次性检索图像列表
目前我可以使用以下代码获取单个图像:-
AWS.config.update({
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey
});
AWS.config.region = region;
var bucketInstance = new AWS.S3();
var params = {
Bucket: bucketName,
Key: awsImgUrl
}
bucketInstance.getObject(params, function (err, file) {
if (file) {
var dataSrc = "data:" + file.ContentType + ";base64," + EncodeData(file.Body);
callbackSuccess(dataSrc);
} else {
callbackSuccess("Error");
}
});
EncodeData = function (data) {
var str = data.reduce(function (a, b) { return a + String.fromCharCode(b) }, '');
return btoa(str).replace(/.{76}(?=.)/g, '$&\n');
}
在我的场景中,我有多个 S3 映像 url,例如 awsImgUrl1、awsImgUrl2..awsImgUrln。
如何一次获取而不是一个一个获取?
AWS SDK 没有任何方法可以一次读取多个文件,与控制台相同,您不能一次下载多个文件。
they have only GetObject method do read a object in bucket by key only.
所以在你的情况下,只有当你已经有了键名作为列表时,你才必须用它们的键名一个一个地阅读..
如果您想获取对象列表,则可以获取存储桶中对象的摘要,然后循环下载所有文件。
使用 S3 每次 api 调用只能获取一张图像。但是,您可以并行进行多个调用。
使用承诺这很简单。
var bucketInstance = new AWS.S3();
var imageKeys = [ awsImgUrl1, awsImgUrl2, awsImgUrl3];
var promisesOfS3Objects = imageKeys.map(function(key) {
return bucketInstance.getObject({
Bucket: bucketName,
Key: key
}).promise()
.then(function (file) {
return "data:" + file.ContentType + ";base64," + EncodeData(file.Body);
})
})
Promise.all(promisesOfS3Objects)
.then(callbackSuccess) // callbackSuccess is called with an array of string
.catch(function() { callbackSuccess("Error") })
您可以更改上传图像数据的方式。不要上传单张图片,而是上传包含多张图片数据的文档。
const addImageBlock = () => {
var photoBlock = [
{
imageId: 'id',
type: 'png',
body: 'data:image/png;base64,iVBORw0K...'
},
{
imageId: 'id2',
type: 'png',
body: 'data:image/png;base64,iVBORw0K...'
},
{
imageId: 'id3',
type: 'png',
body: 'data:image/png;base64,iVBORw0K...'
},
{
imageId: 'id4',
type: 'png',
body: 'data:image/png;base64,iVBORw0K...'
}
//...ect
];
s3.upload({
Key: photoBlockId + '.json',
Body: photoBlock,
ACL: 'public-read'
}, function(err, data) {
if (err) {
return alert('There was an error', err.message);
}
});
}
然后当您通过一个 s3 调用收到此数据时,您可以循环并在前端渲染图像,
getObject(params, function (err, file) {
imageArr = [];
if (file) {
JSON.parse(file.toString()).map((image) => {
var image = new Image();
image.src = image.body;
imageArr.push(image)
})
callbackSuccess(imageArr);
}
else {
callbackSuccess("Error");
}
});
我想根据图像 URL.
从 Amazon S3 一次性检索图像列表目前我可以使用以下代码获取单个图像:-
AWS.config.update({
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey
});
AWS.config.region = region;
var bucketInstance = new AWS.S3();
var params = {
Bucket: bucketName,
Key: awsImgUrl
}
bucketInstance.getObject(params, function (err, file) {
if (file) {
var dataSrc = "data:" + file.ContentType + ";base64," + EncodeData(file.Body);
callbackSuccess(dataSrc);
} else {
callbackSuccess("Error");
}
});
EncodeData = function (data) {
var str = data.reduce(function (a, b) { return a + String.fromCharCode(b) }, '');
return btoa(str).replace(/.{76}(?=.)/g, '$&\n');
}
在我的场景中,我有多个 S3 映像 url,例如 awsImgUrl1、awsImgUrl2..awsImgUrln。
如何一次获取而不是一个一个获取?
AWS SDK 没有任何方法可以一次读取多个文件,与控制台相同,您不能一次下载多个文件。
they have only GetObject method do read a object in bucket by key only.
所以在你的情况下,只有当你已经有了键名作为列表时,你才必须用它们的键名一个一个地阅读..
如果您想获取对象列表,则可以获取存储桶中对象的摘要,然后循环下载所有文件。
使用 S3 每次 api 调用只能获取一张图像。但是,您可以并行进行多个调用。 使用承诺这很简单。
var bucketInstance = new AWS.S3();
var imageKeys = [ awsImgUrl1, awsImgUrl2, awsImgUrl3];
var promisesOfS3Objects = imageKeys.map(function(key) {
return bucketInstance.getObject({
Bucket: bucketName,
Key: key
}).promise()
.then(function (file) {
return "data:" + file.ContentType + ";base64," + EncodeData(file.Body);
})
})
Promise.all(promisesOfS3Objects)
.then(callbackSuccess) // callbackSuccess is called with an array of string
.catch(function() { callbackSuccess("Error") })
您可以更改上传图像数据的方式。不要上传单张图片,而是上传包含多张图片数据的文档。
const addImageBlock = () => {
var photoBlock = [
{
imageId: 'id',
type: 'png',
body: 'data:image/png;base64,iVBORw0K...'
},
{
imageId: 'id2',
type: 'png',
body: 'data:image/png;base64,iVBORw0K...'
},
{
imageId: 'id3',
type: 'png',
body: 'data:image/png;base64,iVBORw0K...'
},
{
imageId: 'id4',
type: 'png',
body: 'data:image/png;base64,iVBORw0K...'
}
//...ect
];
s3.upload({
Key: photoBlockId + '.json',
Body: photoBlock,
ACL: 'public-read'
}, function(err, data) {
if (err) {
return alert('There was an error', err.message);
}
});
}
然后当您通过一个 s3 调用收到此数据时,您可以循环并在前端渲染图像,
getObject(params, function (err, file) {
imageArr = [];
if (file) {
JSON.parse(file.toString()).map((image) => {
var image = new Image();
image.src = image.body;
imageArr.push(image)
})
callbackSuccess(imageArr);
}
else {
callbackSuccess("Error");
}
});