按照提到的示例here,我使用了firebase函数:
1)将上传的照片调整为两个不同的尺寸
2)然后该函数将检索url并将其写入数据库,以便客户端应用程序可以在需要时检索适当的缩略图。
不幸的是,我的计划永远不会实现,因为firebase功能非常缓慢地完成其操作,并且客户端应用程序等待那么长时间是令人望而却步的。 请记住,我不是在谈论功能冷启动...无论图像大小或上传的图像数量如何,该功能在每次执行时都会保持缓慢。
这有什么特别的原因??我做错了吗?
这是我的代码:
exports.generateThumbnailImages = storageRef.onChange(event => {
const object = event.data;
const fileBucket = object.bucket;
const filePath = object.name;
const contentType = object.contentType;
const resourceState = object.resourceState;
const metageneration = object.metageneration;
var folder=filePath.split('/')[0];
var fileName=filePath.split('/')[1];
// console.log(folder);
if (folder){
if (folder.startsWith('images') && !fileName.includes('thumb')) {
if(resourceState=='not_exists'){
console.log('THIS IS A DELETION EVENT '+fileName);
}
else if(resourceState==='exists' && metageneration>1){
console.log('THIS IS A METAGENERATION EVENT '+fileName);
}
else if(resourceState==='exists'){
console.log('THIS IS A CREATION EVENT '+fileName);
const bucket = gcs.bucket(fileBucket);
const tempFilePath = '/tmp/${fileName}';
const tempFilePathBig = '/tmp/${fileName}'+'Big';
bucket.file(filePath).download({destination: tempFilePath}).then(function() {
bucket.file(filePath).download({destination: tempFilePathBig}).then(function() {
console.log('IMAGE DOWNLOADED LOCALLY TO', tempFilePath);
spawn('convert', [tempFilePath, '-thumbnail', '200x200', tempFilePath]).then(function() {
spawn('convert', [tempFilePathBig, '-thumbnail', '400x400', tempFilePathBig]).then(function() {
console.log('THUMBNAIL CREATED AT', tempFilePath);
const thumbFilePath = filePath.replace(/(\/)?([^\/]*)$/, '$1thumb_$2');
const thumbFilePathBig = filePath.replace(/(\/)?([^\/]*)$/, '$1thumb_Big$2');
bucket.upload(tempFilePath, {destination: thumbFilePath}).then(function(){
bucket.upload(tempFilePathBig, {destination: thumbFilePathBig}).then(function(){
return;
});
});
});
});
});
});
}`
答案 0 :(得分:0)
您可以尝试将两个spawn
命令合并为一个,而不是两次下载/处理相同的图像。
bucket.file(filePath).download({destination: tempFilePath}).then(function() {
spawn('convert', [tempFilePath,
'-thumbnail', '400x400',
'-write', $tempFilePath400,
'-thumbnail', '200x200',
'-write', $tempFilePath200,
'null:']).then(function() {
// ...
我还建议探索一个基于队列的后台工作者;这样,客户端应用程序就会知道工作已推迟。