Firebase Cloud Storage文件上传出现TypeError路径读取错误求助
问题根源
你混用了Firebase客户端存储SDK(firebase/storage)和Firebase Admin存储SDK(firebase-admin/storage)的API。客户端SDK的ref()函数无法识别Admin SDK返回的Storage实例,导致内部无法读取_location.path,触发了类型错误。
解决方案
在Firebase Functions场景下,优先使用Admin SDK处理存储操作(默认使用服务账号权限,无需额外认证),以下是修正后的代码:
const { initializeApp } = require('firebase-admin/app'); const { getStorage } = require('firebase-admin/storage'); const firebaseConfig = {...} const firebaseApp = initializeApp(firebaseConfig); const storage = getStorage(firebaseApp); const uploadImagesToFirebase = async () => { try { // 获取默认存储桶,如需指定桶名可传入参数:storage.bucket('your-custom-bucket') const bucket = storage.bucket(); // 上传本地文件到Storage的images目录下 const uploadResponse = await bucket.upload( '/Users/donovancotter/Desktop/Projects/image-uploaded/functions/public/37f8eb5d-8b42-45ed-ba3b-c7d35a299a62-0-1111264718.png', { destination: 'images/37f8eb5d-8b42-45ed-ba3b-c7d35a299a62-0-1111264718.png' } ); return uploadResponse; } catch (e) { console.log(e); } };
若你坚持使用客户端SDK(不推荐在Functions环境中使用),需确保全程使用客户端API,且uploadBytes不接受本地文件路径,需传入文件Buffer:
const { ref, uploadBytes, getStorage } = require('firebase/storage'); const { initializeApp } = require('firebase/app'); const fs = require('fs'); const firebaseConfig = {...} // 初始化客户端Firebase App,而非Admin App const firebaseApp = initializeApp(firebaseConfig); const storage = getStorage(firebaseApp); const uploadImagesToFirebase = async () => { const storageRef = ref(storage, 'images/37f8eb5d-8b42-45ed-ba3b-c7d35a299a62-0-1111264718.png'); try { // 读取本地文件为Buffer const fileBuffer = fs.readFileSync('/Users/donovancotter/Desktop/Projects/image-uploaded/functions/public/37f8eb5d-8b42-45ed-ba3b-c7d35a299a62-0-1111264718.png'); const upload = await uploadBytes(storageRef, fileBuffer); return upload; } catch (e) { console.log(e); } };
关键注意点
- 两种Firebase存储SDK的API体系完全独立,绝对不能混用;
- Functions环境中Admin SDK是更合适的选择,无需处理用户认证,权限控制更灵活;
- 客户端SDK的
uploadBytes仅接受Buffer/Blob类型的文件内容,不支持直接传入本地路径。
内容的提问来源于stack exchange,提问作者dcotter
相关产品推荐
相关产品推荐

