Next.js 13服务端转发上传文件至第三方API报400,求排查
问题分析与解决
你的问题核心出在手动指定multipart/form-data请求头上。当用axios发送FormData时,axios会自动生成包含boundary的正确Content-Type头(格式类似multipart/form-data; boundary=----WebKitFormBoundaryXXXX),手动设置的话会丢失关键的boundary参数,导致第三方服务器无法正确解析表单数据,最终返回400错误。
即便去掉请求头后仍报错,大概率是FormData的字段名和第三方服务器要求不匹配,或是文件对象传递过程中出现异常。
修正后的代码
import axios from "axios" import { NextRequest, NextResponse } from "next/server" export async function POST(request: NextRequest) { try { const formData = await request.formData() const route = `${process.env.API_URL}/Api/SendContact` // 移除手动设置的Content-Type,让axios自动处理表单头 const response = await axios.post(route, formData, { headers: { // 若第三方服务器需要授权等其他头,在此添加,不要加Content-Type }, }) return NextResponse.json(response.data) } catch (error) { // 捕获错误并打印详情,方便排查问题 console.error("转发请求失败:", error) return NextResponse.json( { message: "请求转发失败", error: (error as Error).message }, { status: 500 } ) } }
额外排查步骤
- 对比Swagger调用的请求参数,确保FormData中的字段名(包括大小写)和第三方服务器要求完全一致。
- 检查第三方服务器是否需要额外请求头(如授权token),如果有,需在axios的headers配置中补充。
- 可以在代码中打印FormData内容,确认文件和其他字段是否被正确解析:
for (const [key, value] of formData.entries()) { console.log(key, value) }
内容的提问来源于stack exchange,提问作者Ludder
相关产品推荐
相关产品推荐

