You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:03:13