我是云函数的新手,正在创建一个函数,可以将Flutter image_picker中的图像上传到云存储中,下面是相关的云fn代码:
// upload image to storage
const bucket = admin.storage().bucket();
const destination = data.storageCollection + '/' + data.itemID;
const filePath = data.filePath;
console.log('filePath is ' + data.filePath);
await bucket.upload(filePath, {
destination: destination,
gzip: true,
});
我得到这个错误:
uploadProductPic中的函数错误:[firebase_函数/内部]项目:未定义。函数:错误:错误:错误:没有此类文件或目录,请打开"/data/user/0/com.appIdentifier.here/缓存/a2b21481-ab56 - 4af5-bc97 - 4c2d050107e12579524263120800910.jpg "
也许我只是不太擅长存储目录,但我非常确定这是绝对路径。我也尝试过其他组合:
x一个一个一个一个x一个一个二个一个x一个一个三个一个
什么都没起作用。有人能告诉我为什么我的路径是错误的吗?我只是从一个XFile的. path属性中得到它。我发现了一些类似的堆栈帖子,但还没有找到解决方案。
编辑:这是我的客户端代码
Future<void> uploadProductPic(String productID, XFile file) async {
try {
await functions.httpsCallable('uploadImage').call(<String, String>{
"filePath": file.path,
"itemID": productID,
"storageCollection": "productPic",
"itemCollection": "products"
});
} catch (e) {error catching stuff}
这是我的完整云函数:
/**
*
* @param {string} filePath
* @param {string} itemID
* @param {string} storageCollection
* @param {string} itemCollection
*/
exports.uploadImage = functions.region("australia-southeast1")
.https.onCall(async (data, context) => {
// Only allow authorised users to execute this function.
if (!(context.auth && context.auth.token)) {
throw new functions.https.HttpsError(
"permission-denied",
"Must be an administrative user to upload an image."
);
}
try {
// upload image to storage
const bucket = admin.storage().bucket();
const destination = data.storageCollection + '/' + data.itemID;
const filePath = data.filePath;
await bucket.upload(filePath, {
destination: destination,
gzip: true,
});
// get download url
const url = await bucket.getDownloadURL(destination);
// upload url to database
const firebaseRef = data.itemCollection + '/' + data.itemID;
await firebaseTools.firestore.updateDoc(firebaseRef, {'imageURL': url});
} catch (err) {
throw new functions.https.HttpsError("internal", "project: " +
process.env.GCP_PROJECT +
". Function: uploadImage. Error: " + String(err));
}
}
);
谢谢你的帮助!
1条答案
按热度按时间ttygqcqt1#
云功能在云中的完全远程计算机上运行,而不是在安装应用的设备上运行。它无法访问设备上的本地文件。
如果要从应用上传文件,应使用适用于应用平台的Firebase Storage SDK,而不是Cloud Functions。