Heroku部署环境大文件上传报413(Payload Too Large)问题求助
解决大文件上传413(Payload Too Large)错误的方案
排查方向1:Cloudflare上传限制
Cloudflare默认上传大小限制为100MB,免费套餐无法突破此限制,需升级至Pro及以上套餐;付费套餐用户可按以下步骤调整:
- 登录Cloudflare控制台,进入对应域名的管理页面
- 导航至「规则」→「传输规则」,添加新规则
- 设置「最大上传大小」为250MB以上(建议300MB),覆盖默认限制
排查方向2:Node.js服务的请求大小限制
即使Heroku路由器默认支持300MB请求,Node.js服务(如Express)的body解析组件可能存在额外限制,需手动调整:
- 若使用Express内置的body解析:
app.use(express.json({ limit: '300mb' })); app.use(express.urlencoded({ limit: '300mb', extended: true })); - 若使用multer处理表单数据:
const multer = require('multer'); const upload = multer({ limits: { fileSize: 300 * 1024 * 1024 } });
排查方向3:优化S3直传流程(核心解决方案)
当前流程可能存在客户端通过Heroku传递文件分片数据的情况,导致触发中间代理的大小限制。建议调整为纯直传S3的分片上传流程:
- 修改签名接口,仅接收文件元数据(文件名、总大小、分片数量等),不接收任何文件数据
- 接口返回S3分片上传所需的每个分片的预签名URL及上传参数
- 客户端直接使用这些预签名URL将每个分片上传至S3,完全绕过Heroku和Cloudflare
- 所有分片上传完成后,客户端再调用接口通知服务端完成S3分片合并
排查方向4:确认Heroku路由器限制
Heroku路由器默认允许最大300MB的请求大小,若已升级dynos仍报错,需确认是否存在其他代理层(如自定义域名的额外配置)干扰,可直接使用Heroku提供的默认域名测试上传,排除第三方域名配置问题
内容的提问来源于stack exchange,提问作者Can777
相关产品推荐
相关产品推荐

