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

使用Firebase Function V2上传文件至Firebase Storage遇报错求助

解决Firebase Function上传文件的ENOENT错误

错误原因

你当前代码里的bucket.upload()方法要求传入本地文件系统的路径,但你传入的是远程图片URL,函数会尝试在本地查找这个路径的文件,自然找不到,因此抛出ENOENT: no such file or directory错误。

解决方案

根据你需要上传的文件来源,分两种情况处理:

情况1:上传远程URL指向的文件

需要先将远程文件下载到Firebase Function的临时存储目录(/tmp),再上传到Cloud Storage。

  1. 先安装依赖:
npm install axios fs-extra
  1. 修改后的代码:
import { onRequest } from "firebase-functions/v2/https";
import admin from "firebase-admin";
import axios from "axios";
import fs from "fs-extra";
import path from "path";

admin.initializeApp();

export const uploadFile = onRequest(async (req, res) => {
  try {
    const fileUrl = req.query.fileName as string;
    if (!fileUrl) {
      return res.status(400).send("缺少fileName查询参数");
    }

    // 下载远程文件到临时目录
    const tempFilePath = path.join("/tmp", "temp-image.jpg");
    const response = await axios({
      url: fileUrl,
      method: "GET",
      responseType: "stream"
    });

    await new Promise((resolve, reject) => {
      response.data.pipe(fs.createWriteStream(tempFilePath))
        .on("finish", resolve)
        .on("error", reject);
    });

    // 上传到Cloud Storage
    const bucket = admin.storage().bucket("gs://some-bucket.appspot.com");
    const fileRef = await bucket.upload(tempFilePath, {
      destination: "testFile.jpg"
    });

    // 清理临时文件
    await fs.unlink(tempFilePath);

    res.status(200).send({
      message: "文件上传成功",
      fileInfo: fileRef[0].metadata
    });
  } catch (error) {
    console.error("上传失败:", error);
    res.status(500).send(`上传失败: ${error.message}`);
  }
});

情况2:上传请求体中的文件(表单上传)

如果是通过表单(multipart/form-data格式)上传文件,需要用multer处理请求体中的文件,再上传到Cloud Storage。

  1. 先安装依赖:
npm install multer
  1. 修改后的代码:
import { onRequest } from "firebase-functions/v2/https";
import admin from "firebase-admin";
import multer from "multer";

admin.initializeApp();

// 配置multer将文件存储到临时目录
const multerStorage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, "/tmp/");
  },
  filename: (req, file, cb) => {
    cb(null, file.originalname);
  }
});
const uploadMiddleware = multer({ storage: multerStorage });

// 使用multer中间件处理单个文件上传(表单字段名为"file")
export const uploadFile = onRequest(uploadMiddleware.single("file"), async (req, res) => {
  try {
    if (!req.file) {
      return res.status(400).send("未上传文件");
    }

    const bucket = admin.storage().bucket("gs://some-bucket.appspot.com");
    const fileRef = await bucket.upload(req.file.path, {
      destination: `uploads/${req.file.originalname}`
    });

    res.status(200).send({
      message: "文件上传成功",
      fileInfo: fileRef[0].metadata
    });
  } catch (error) {
    console.error("上传失败:", error);
    res.status(500).send(`上传失败: ${error.message}`);
  }
});

注意事项

  • Firebase Function的临时目录(/tmp)最大可用空间为512MB,不适合上传过大的文件。
  • 下载远程文件时,要处理网络超时、跨域限制等异常情况。
  • 表单上传时,需确保请求的Content-Type设置为multipart/form-data。

内容的提问来源于stack exchange,提问作者Matias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:06:13