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

Next.js 13.2路由处理器中如何获取请求体里的文件?

解决Next.js API路由无法获取FormData文件的问题

你遇到的问题核心是:Next.js默认的NextApiRequest没有内置解析multipart/form-data(文件上传专用格式)的能力,所以req.files本身就是undefined,直接访问req.files.file必然报错。

下面是具体的解决步骤:

方案一:用next-connect(适配Next.js的推荐方案)

1. 安装依赖

npm install next-connect multer
# 或
yarn add next-connect multer

2. 修改API路由代码

import type { NextApiRequest, NextApiResponse } from 'next'
import nextConnect from 'next-connect'
import multer from 'multer'

// 配置文件存储方式,这里用内存存储,也可改成磁盘存储
const storage = multer.memoryStorage()
const upload = multer({ storage })

const handler = nextConnect<NextApiRequest, NextApiResponse>()
  // 解析表单中名为'file'的单个文件
  .use(upload.single('file'))
  .post((req, res) => {
    // 现在req.file就是你上传的文件对象
    console.log(req.file)
    // 这里可以添加文件处理逻辑,比如读取buffer、保存到磁盘等
    res.status(200).json({ message: '文件接收成功', fileName: req.file?.originalname })
  })

export default handler

// 必须禁用Next.js默认的body解析器,交给multer处理
export const config = {
  api: {
    bodyParser: false,
  },
}

方案二:直接使用multer(不借助next-connect)

修改API路由代码

import type { NextApiRequest, NextApiResponse } from 'next'
import multer from 'multer'

const storage = multer.memoryStorage()
const upload = multer({ storage })

// 把multer中间件适配成Next.js API路由支持的形式
const uploadMiddleware = upload.single('file')

export async function POST(req: any, res: NextApiResponse) {
  await new Promise((resolve, reject) => {
    uploadMiddleware(req, res, (err) => {
      if (err) reject(err)
      else resolve(null)
    })
  })

  console.log(req.file)
  res.status(200).json({ message: '文件接收成功' })
}

// 同样要禁用默认body解析器
export const config = {
  api: {
    bodyParser: false,
  },
}

前端代码注意事项

你的前端代码没问题,但要记住:axios会自动根据FormData生成正确的Content-Type: multipart/form-data请求头,不要手动设置这个头,手动添加反而可能导致解析失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:42:54