使用krajee bootstrap upload上传失败,move_uploaded_file报错求排查
排查 move_uploaded_file 上传失败的常见低级问题
我完全懂你现在的困扰——旧上传路径(777权限)能正常跑,但换了新目标路径后,用krajee Bootstrap Upload上传就卡在move_uploaded_file环节,明明感觉是自己犯了低级错误,就是找不到在哪。结合你贴的代码,我整理了几个最容易忽略的点,你可以挨个排查:
1. 先盯紧新路径的权限与正确性
虽然旧uploads文件夹权限没问题,但你得确认新目标路径的实际状态:
- 先检查代码里的
"uploads" . DIRECTORY_SEPARATOR . ...是不是真的指向你预期的新路径?有没有拼写错误?比如是不是应该是../uploads(上级目录)或者其他相对路径? - 在代码里加一行
var_dump(is_writable("uploads"));,直接输出这个目录是否可写。有时候就算你设了777,也可能因为目录所有者、用户组不匹配,导致实际没有写入权限。
2. 文件名生成的小细节
你用md5(uniqid())生成文件名的思路没问题,但可以确认下最终生成的路径是否合法:
- 在
move_uploaded_file之前加一句var_dump($target);,看看最终的文件路径是不是符合预期,有没有出现奇怪的字符或者层级错误。 - 另外,处理后缀的
array_pop($ext),如果遇到类似file.name.txt这种多后缀的文件,只会拿到最后一个后缀,这本身没问题,但你可以确认下$ext数组是不是正常。
3. 临时文件的有效性检查
有时候前端看似传了文件,但服务器的临时文件可能出问题:
- 在
move_uploaded_file之前加个判断,确认临时文件是合法的上传文件:if(!is_uploaded_file($_FILES["filer42"]["tmp_name"][$i])) { var_dump('临时文件不存在或不是合法的上传文件'); exit; } - 不过旧脚本能正常运行的话,服务器的
upload_tmp_dir配置大概率没问题,但也可以快速确认下这个目录的权限。
4. 代码里的明显语法错误!
我看你贴的代码里有一行:if ($success === true) {. $output = [];——这里多了个多余的.号!这会直接触发PHP语法错误,导致整个脚本运行失败,返回的JSON肯定是错误的!这绝对是个典型的低级错误,你应该是复制代码的时候手滑了,把它改成:
if ($success === true) { $output = []; $output = ['uploaded' => $paths]; }
这个错误大概率就是你现在的核心问题,先把它修复了再看其他的。
5. 看错误日志找精准线索
如果上面的点都排查完还是不行,赶紧打开PHP的错误日志看看具体报错信息——move_uploaded_file失败时,日志里会明确告诉你是权限不足、路径不存在还是其他问题,比你自己猜要高效多了。
先把那个语法错误修复,再一步步排查,应该很快就能解决问题啦。
内容的提问来源于stack exchange,提问作者Sebastian Støttrup
相关产品推荐
相关产品推荐

