我正在开发一个用户可以上传图像的网站。当他们上传图像时,会触发
onFinalize
,它将创建一个包含图像 URL 等内容的文档。在使用云函数之前,我会在客户端使用 getDownloadURL
来获取 imageURL 并将其保存到文档中,但由于我使用云函数,我现在使用图像元数据和 mediaLink 作为 imageURL 但我可以看到它的表现与 getDownloadURL
不一样。
这是我目前正在使用的功能:
exports.imageFirestoreCreate = functions.storage
.bucket()
.object()
.onFinalize(async (object) => {
console.log(object);
if (
object.contentType.startsWith("image/") &&
object.name.startsWith("images/")
) {
const uploadDate = object.timeCreated;
const imageLink = object.mediaLink;
const images = firestore.collection("images");
return images.add({
imageURL: imageLink,
createdAt: uploadDate,
});
} else {
return null;
}
});
有没有办法从 onFinalize
getDownloadURL
?
据我了解,您需要一个云函数,当新文件上传到存储桶时应该触发该函数。为了能够通过 Cloud Functions 而不是客户端读取下载 URL,请使用以下代码行:
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp()
exports.imageFirestoreCreate = functions.storage.object().onFinalize(async (object) => {
const newFile = admin.storage().bucket(object.bucket).file(object.name);
const config = { action: 'read', expires: '01-01-2033' };
const downloadUrls = await newFile.getSignedUrl(config);
const downloadUrl = downloadUrls[0];
const images = firestore.collection("images");
await images.add({
imageURL: downloadUrl,
});
});
上面的代码将在
images
集合中添加一个新文档,其中包含上传文件的下载URL。