我正在尝试将资产(图像)组织到每个资产具有唯一ID的文件夹中,原因是每个资产将具有多种格式(缩略图,以及针对Web和不同视口进行了优化的格式)。
因此,对于我上传到文件夹assets-temp/
的每项资产,然后通过函数将其移动并重命名为assets/{unique-id}/original{extension}
。
示例:assets-temp/my-awesome-image.jpg
应该变成assets/489023840984/original.jpg
。
注意:我还将在数据库和原始文件的元数据中跟踪文件的原始名称。
问题:该函数可以运行并执行我想要的操作,但是它还会添加一个名为assets/{uuid}/original/
的文件夹,其中没有任何内容...
功能:
exports.process_new_assets = functions.storage.object().onFinalize(async (object) => {
// Run this function only for files uploaded to the "assets-temp/" folder.
if (!object.name.startsWith('assets-temp/')) return null;
const file = bucket.file(object.name);
const fileExt = path.extname(object.name);
const destination = bucket.file(`assets/${id}/original${fileExt}`);
const metadata = {
id,
name: object.name.split('/').pop()
};
// Move the file to the new location.
return file.move(destination, {metadata});
});
答案 0 :(得分:1)
我猜测,如果上传原始图像的操作触发两个单独的事件,则可能会发生这种情况:一个创建目录资产临时目录,另一个创建文件资产临时目录/ my- awesome-image.jpg。
如果我猜对了,则第一个操作将使用目录对象(名为"assets-temp/"
)触发您的函数。这与您的第一个if
相匹配,因此代码可以继续执行
destination = bucket.file('assets/${id}/original') // fileExt being empty
然后调用file.move-这将创建assets/id/original/
目录。
只需改善您的“如果”,即可排除名为“ assets-temp /”的文件。
答案 1 :(得分:0)
根据documentation,云存储中没有文件夹之类的东西,但是可以像使用控制台GUI一样模拟它们。创建文件夹时,真正发生的事情是创建了一个空对象(零字节空间),但其名称以正斜杠结尾,文件夹名称也可以以_$folder$
结尾,但据我所知,这就是工作方式在较旧的版本中,因此对于较新的存储桶而言,正斜杠就足够了。