php上传文件被截断需协同调整php.ini(upload_max_filesize=64m、post_max_size=72m、max_execution_time=300等)和nginx(client_max_body_size=64m)配置,再通过$_files['error']检测upload_err_partial或upload_err_no_file错误码并验证日志。

PHP上传文件被截断,通常是因为服务器配置限制了上传大小或超时时间,而不是代码本身出错。修复关键在 php.ini 和 Web服务器(如Nginx/Apache)配置 的协同调整,而非仅改PHP脚本。下面给出完整、可落地的修复步骤和验证代码。
检查并修改 php.ini 核心上传参数
上传被截断最常见原因是 upload_max_filesize 和 post_max_size 设置过小,且二者需合理匹配:
-
upload_max_filesize = 64M(单个文件最大允许大小) -
post_max_size = 72M(整个POST请求体上限,必须 ≥ upload_max_filesize + 其他表单字段开销) -
max_execution_time = 300(避免大文件上传超时中断) -
max_input_time = 300(PHP解析输入数据的最长时间) -
memory_limit = 256M(确保PHP进程有足够内存处理上传缓冲)
修改后务必重启PHP服务(如 sudo systemctl restart php8.1-fpm)并用 phpinfo() 验证生效。
检查 Web服务器限制(以 Nginx 为例)
Nginx 默认限制 client_max_body_size,若未设置或值过小(如默认 1MB),会直接截断请求,PHP甚至收不到完整数据:
- 在对应 server 或 location 块中添加:
client_max_body_size 64M; - 同时建议设置超时项:
client_body_timeout 300;<br>fastcgi_read_timeout 300;
- 修改后执行
sudo nginx -t && sudo systemctl reload nginx
PHP端上传状态检测与错误提示(实用代码)
仅靠前端判断不可靠,PHP必须检查 $_FILES['file']['error']。被截断时典型错误码为 UPLOAD_ERR_PARTIAL (3) 或更隐蔽的 UPLOAD_ERR_NO_FILE (4)(因POST体不完整导致文件字段丢失):
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$file = $_FILES['upload_file'] ?? null;
if (!$file || $file['error'] === UPLOAD_ERR_NO_FILE) {
die('错误:未收到文件或表单数据不完整(可能被截断)');
}
if ($file['error'] === UPLOAD_ERR_PARTIAL) {
die('错误:文件上传被截断,请检查php.ini和Web服务器配置');
}
if ($file['error'] !== UPLOAD_ERR_OK) {
$errors = [
UPLOAD_ERR_INI_SIZE => '文件超过 php.ini 中 upload_max_filesize 限制',
UPLOAD_ERR_FORM_SIZE => '文件超过 HTML 表单中 MAX_FILE_SIZE 限制',
UPLOAD_ERR_NO_TMP_DIR => '找不到临时文件夹',
UPLOAD_ERR_CANT_WRITE => '文件写入失败',
UPLOAD_ERR_EXTENSION => '文件上传被扩展名过滤器阻止'
];
die('上传失败:' . ($errors[$file['error']] ?? '未知错误'));
}
// 安全移动文件
$target = __DIR__ . '/uploads/' . basename($file['name']);
if (move_uploaded_file($file['tmp_name'], $target)) {
echo '✅ 上传成功:' . htmlspecialchars($file['name']);
} else {
die('❌ 移动临时文件失败');
}
}
?>
快速验证是否修复成功
不要只测小文件。推荐三步验证:
- 用 50MB+ 的测试文件(如大视频或压缩包)上传
- 查看 PHP 错误日志:
tail -f /var/log/php8.1-fpm/error.log,确认无“allowed memory size exhausted”或“request entity too large” - 检查 Nginx 错误日志:
tail -f /var/log/nginx/error.log,排除 413 Request Entity Too Large 报错
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











