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

Laravel中680MB文件转JSON POST上传失败,服务器无响应

大文件POST上传失败的排查方案

1. Apache层面的硬性限制

Apache本身的配置可能截断大请求,和PHP设置无关:

  • LimitRequestBody:这个参数控制Apache允许的请求体最大字节数,部分Plesk默认模板会设置上限(比如1GB以内)。需要确认虚拟主机或全局Apache配置中该值是否大于900MB(680MB文件Base64编码后会膨胀33%,约904MB),建议设为LimitRequestBody 0(不限制)或LimitRequestBody 1000000000(约954MB)。
  • Timeout:大文件上传耗时更长,默认300秒可能不够,将Apache的Timeout参数调至600秒,避免上传过程中连接超时断开。

2. Plesk面板的额外限制

Plesk Obsidian会覆盖部分Apache/PHP配置:

  • 进入域名 > 主机设置 > 性能,检查“最大请求大小”选项,将值调整至大于900MB。
  • 若开启ModSecurity,它会拦截超大请求:临时关闭ModSecurity测试上传,若恢复正常,再调整ModSecurity的SecRequestBodyLimit和SecRequestBodyNoFilesLimit参数,设置为足够大的值。

3. PHP未覆盖的相关参数

即使已调整memory_limit和post_max_size,仍需检查:

  • upload_max_filesize:虽未直接传文件,但部分环境下该参数会间接影响POST请求处理,设为与post_max_size一致的4GB。
  • max_input_time:大体积Base64字符串解析耗时久,120秒可能不足,调至300秒。

4. 传输方式优化建议

Base64编码的体积膨胀是核心负担,建议:

  • 直接上传二进制文件,而非转成Base64嵌入JSON,减少33%的传输体积和服务器解析压力。
  • 若必须用JSON,采用分块上传:将大文件拆分为多个小Base64块,分多次请求上传,最后在服务器端拼接。

5. 无权限下的调试方法

  • 用curl -v上传,观察连接断开时的状态码(比如413 Request Entity Too Large可直接定位大小限制)。
  • 部署极简接收脚本排查请求是否被截断:
<?php
$logFile = 'upload_debug.log';
// 记录请求头中的内容长度
file_put_contents($logFile, date('Y-m-d H:i:s') . " - Content-Length: {$_SERVER['CONTENT_LENGTH']}\n", FILE_APPEND);
// 读取并记录实际接收的内容长度
$rawContent = file_get_contents('php://input');
file_put_contents($logFile, date('Y-m-d H:i:s') . " - Received Length: " . strlen($rawContent) . "\n", FILE_APPEND);
echo "Received";
?>

对比日志中的两个长度,若不一致则说明请求被中间环节截断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:35:29