Node.js后端传图至Firebase Storage遇byteLength未定义错误
解决Firebase Storage上传时的TypeError: Cannot read properties of undefined (reading 'byteLength')错误
问题原因
Firebase Storage的uploadBytes方法在Node.js环境下不支持直接传入fs的ReadStream,它期望的输入类型是Blob、Uint8Array(或Node.js的Buffer,因为Buffer是Uint8Array的子类)、File。你传入的ReadStream对象没有byteLength属性,导致内部处理逻辑抛出该错误。
修复方案1:读取文件为Buffer上传(适合小文件)
将读取文件的方式从ReadStream改为读取成Buffer,直接传入uploadBytes:
import { storage } from "../auth/firebase.js"; import { ref, uploadBytes, getDownloadURL } from "firebase/storage"; import fs from "fs/promises"; // 使用Promise版fs,适配async/await export const uploadImageToStorage = async (file) => { try { const storageRef = ref(storage, "uploads/" + file.filename); console.log("API:", file); // 读取本地文件为Buffer const fileBuffer = await fs.readFile(file.path); // 上传Buffer,同时指定文件MIME类型 const snapshot = await uploadBytes(storageRef, fileBuffer, { contentType: file.mimetype }); const downloadURL = await getDownloadURL(snapshot.ref); return downloadURL; } catch (error) { console.error("Image upload error:", error); return null; } };
修复方案2:使用流式上传(适合大文件)
如果上传的文件体积较大,不想将整个文件读入内存,可以使用Firebase提供的uploadStream方法进行流式上传:
import { storage } from "../auth/firebase.js"; import { ref, uploadStream, getDownloadURL } from "firebase/storage"; import fs from "fs"; export const uploadImageToStorage = async (file) => { try { const storageRef = ref(storage, "uploads/" + file.filename); console.log("API:", file); const fileStream = fs.createReadStream(file.path); // 创建上传流 const uploadTask = uploadStream(storageRef, undefined, { contentType: file.mimetype }); // 监听上传完成状态 await new Promise((resolve, reject) => { fileStream.pipe(uploadTask); uploadTask.on("error", reject); uploadTask.on("complete", resolve); }); const downloadURL = await getDownloadURL(storageRef); return downloadURL; } catch (error) { console.error("Image upload error:", error); return null; } };
额外说明
- 你之前尝试的
dataURItoBlob函数是针对前端Data URI的转换逻辑,不适用于Node.js本地文件场景,因此无法解决问题。 - 上传时务必指定
contentType参数,否则Firebase Storage会默认将文件识别为application/octet-stream,导致下载或预览时无法正确识别文件类型。
内容的提问来源于stack exchange,提问作者vishal
相关产品推荐
相关产品推荐

