NextJS 14 Server Action中FormData被1MB截断,bodySizeLimit不生效
解决思路
1. 确认next.config.js配置格式正确
确保bodySizeLimit使用字符串格式的单位后缀(小写),错误的格式会导致配置不生效:
/** @type {import('next').NextConfig} */ const nextConfig = { serverActions: { bodySizeLimit: '10mb', }, }; module.exports = nextConfig;
若写成数字10或大写10MB,NextJS无法识别该配置,会沿用默认的1MB限制。
2. 排查中间件或第三方库的拦截限制
如果项目中使用了自定义中间件(如middleware.ts)或请求处理类库,检查这些代码是否设置了独立的请求体大小限制。部分第三方中间件默认会把请求体限制在1MB,需要手动调整对应参数。
3. 替换Base64传输为直接传File对象
Base64会让文件体积膨胀约33%,大幅提高触发长度限制的概率,直接传输原始文件对象更高效且能规避截断问题:
客户端代码修改:
// 移除Base64转换逻辑,直接将文件加入FormData data.append("image", imageFile); const chat = await createChat(data, responseHistory);
Server Action代码修改:
const imageFile = formData.get("image") as File | null; // 按需处理文件,例如转为Buffer const fileBuffer = imageFile ? await imageFile.arrayBuffer() : null;
4. 检查部署环境的平台限制
如果部署在Vercel等平台,平台默认的函数请求体限制可能覆盖你的NextJS配置。以Vercel为例,可通过vercel.json调整:
{ "functions": { "app/**/*.{js,ts,jsx,tsx}": { "maxRequestBodySize": 10485760 // 10MB,单位为字节 } } }
若使用Docker、Nginx等部署环境,检查反向代理或容器配置中的请求体限制参数。
5. 确认Server Action的请求方法
在浏览器开发者工具的Network面板查看请求方法,确保是POST请求。若误转为GET请求,URL的长度限制会直接截断数据(NextJS Server Action默认使用POST,但部分自定义逻辑可能导致方法变更)。
内容的提问来源于stack exchange,提问作者tharris
相关产品推荐
相关产品推荐

