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

使用Busboy与Firebase Functions时遭遇Unexpected end of form错误

解决Firebase Functions中Busboy报Unexpected end of form的方案

核心原因

Firebase HTTP Functions默认会自动解析multipart/form-data类型的请求,导致原始请求流被提前消费,Busboy无法读取完整的表单数据,从而触发"Unexpected end of form"错误。

可行解决方案

1. 禁用Firebase的请求自动解析

修改函数配置,禁用默认的请求体解析器并保留原始请求体Buffer:

export const uploadVideo = functions.https.onRequest({
  rawBody: true, // 保留原始请求体Buffer
  parser: false  // 禁用自动解析multipart/form-data
}, async (req, res) => {
  // 后续逻辑不变,调整Busboy的调用方式
})

2. 调整Busboy的调用方式

由于请求流已被消费,不再使用req.pipe(busboy),而是直接将req.rawBody传给Busboy:

// 替换原有的req.pipe(busboy)
busboy.end(req.rawBody)

3. 完整修正后的代码

import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'
const Busboy = require('busboy')

admin.initializeApp()

export const uploadVideo = functions.https.onRequest({
  rawBody: true,
  parser: false
}, async (req, res) => {
  try {
    const busboy = Busboy({ headers: req.headers })
    let blob: Buffer = Buffer.from('')

    busboy.on('file', (fieldname: string, file: any, filename: string, encoding: string, mimetype: string) => {
      console.log('File received:', filename, mimetype)
      // 收集文件内容
      file.on('data', (data: Buffer) => {
        blob = Buffer.concat([blob, data])
      })
      file.on('end', () => {
        console.log('File stream completed')
      })
    })

    busboy.on('finish', () => {
      console.log('Upload complete, file size:', blob.length)
      res.status(200).send('DONE!')
    })

    busboy.on('error', (error: any) => {
      console.error('Busboy error:', error)
      res.status(500).send(`Internal server error: ${error.message}`)
    })

    busboy.end(req.rawBody)
  } catch (e) {
    console.log('Exception:', e)
    res.status(500).send(`Internal server error: ${(e as Error).message}. Headers: ${JSON.stringify(req.headers)}`)
  }
})

4. 额外排查点

  • 测试时使用小体积webm文件,排除因文件过大导致的传输截断问题。
  • 确认Postman配置:确保form-data中已正确添加文件,且未遗漏必填字段。
  • 查看Firebase Functions日志,验证请求的Content-Type和boundary参数是否完整传递,未被代理或中间件修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:52:30