PHP本地服务器大文件上传报错问题求助
一、先修复代码中的核心错误
你的两个报错都是代码逻辑或路径问题导致的,先解决这些才能顺利排查上传大小的限制问题:
1. 修复「Undefined index: temp」错误
这个错误说明你代码里引用的$_FILES['temp']不存在——大概率是文件上传失败时(比如超过大小限制),PHP直接丢弃了上传请求,导致这个数组索引没生成。你需要先严格检查文件上传的状态,再进行后续操作:
// 注意:这里的'temp'要和你HTML表单中file输入框的name属性保持一致! $fileInputName = 'temp'; // 先判断是否有上传请求 if (!isset($_FILES[$fileInputName])) { die("未选择上传文件,或上传请求无效!"); } // 获取上传错误码,针对性处理 $uploadError = $_FILES[$fileInputName]['error']; if ($uploadError !== UPLOAD_ERR_OK) { $errorMsg = match($uploadError) { UPLOAD_ERR_INI_SIZE => "文件大小超过了php.ini中upload_max_filesize的限制", UPLOAD_ERR_FORM_SIZE => "文件大小超过了表单中MAX_FILE_SIZE的限制", UPLOAD_ERR_PARTIAL => "文件仅完成部分上传", UPLOAD_ERR_NO_FILE => "未选择任何文件", UPLOAD_ERR_NO_TMP_DIR => "服务器缺少临时文件存储目录", UPLOAD_ERR_CANT_WRITE => "无法将文件写入磁盘,请检查目录权限", UPLOAD_ERR_EXTENSION => "PHP扩展阻止了本次文件上传", default => "上传失败,错误代码:$uploadError" }; die($errorMsg); }
2. 修复「file_get_contents找不到文件」错误
你报错中的路径C:\wamp64\www\project\project明显是路径拼接重复了项目目录。另外,不建议用file_get_contents读取临时文件再写入,PHP官方推荐用move_uploaded_file()处理上传文件,更安全高效:
// 获取当前工作目录(即C:\wamp64\www\project) $targetDir = getcwd(); // 获取上传文件的原始文件名(自动过滤非法路径) $fileName = basename($_FILES[$fileInputName]['name']); // 拼接最终保存路径(用DIRECTORY_SEPARATOR适配Windows路径) $targetPath = $targetDir . DIRECTORY_SEPARATOR . $fileName; // 移动临时文件到目标路径 if (move_uploaded_file($_FILES[$fileInputName]['tmp_name'], $targetPath)) { echo "文件上传成功,保存路径:$targetPath"; } else { die("无法将临时文件移动到目标目录,请检查目录读写权限!"); }
二、确保php.ini配置真正生效
你修改了php.ini但无效,大概率是改了错误的配置文件或没重启Apache服务:
1. 找到Apache正在使用的php.ini
创建一个info.php文件,内容如下:
<?php phpinfo(); ?>
访问这个页面,找到「Loaded Configuration File」项,这就是Apache实际加载的php.ini绝对路径,必须修改这个文件,而不是WAMP目录下的其他php.ini副本。
2. 修改关键配置项
打开正确的php.ini,调整以下参数(数值根据你的需求设置,示例为10MB):
; 单个上传文件的最大允许大小 upload_max_filesize = 10M ; POST请求的总大小限制(必须大于upload_max_filesize,因为POST还包含其他表单数据) post_max_size = 12M ; 脚本最长执行时间(大文件上传需要更长时间,默认30秒可能不够) max_execution_time = 300 ; 处理输入数据的最长时间 max_input_time = 300 ; 脚本可用的最大内存 memory_limit = 64M
3. 重启Apache服务
修改完php.ini后,一定要重启WAMP中的Apache服务,否则配置不会生效。
三、检查其他可能的限制
1. HTML表单中的MAX_FILE_SIZE
如果你的表单里有<input type="hidden" name="MAX_FILE_SIZE" value="2097152">,这个值是2MB(2097152字节),需要把它改成和php.ini中upload_max_filesize对应的大小,比如10MB就是10485760。
2. Apache的LimitRequestBody配置
检查Apache的httpd.conf或虚拟主机配置文件,确保没有设置过小的请求体限制:
; 设置为0表示不限制,或设置足够大的字节数(10MB=10485760) LimitRequestBody 0
修改后同样需要重启Apache。
内容的提问来源于stack exchange,提问作者H.Banik




