AlmaLinux 9.2中move_uploaded_file函数无法正常工作求助
上传文件move_uploaded_file失败排查求助
我已经排查了权限、文件路径、文件名、函数调用等所有配置,看起来都没问题,但文件始终无法成功移动到指定的upload文件夹。
相关代码
$folderPath = __DIR__ . "/assets/img/upload/"; $gambar = $_FILES['img']; if (!file_exists($folderPath)) mkdir($folderPath); if (file_exists($folderPath . $gambar["name"])) { return $gambar["name"] . " already in folder! "; } else { $sourcePath = $gambar['tmp_name']; $acak = rand(11111111, 99999999); $NewImageName = str_replace(' ', '', 'gambar' . $acak . '.' . $file_extension); $targetPath = $folderPath . $NewImageName; $move = move_uploaded_file($sourcePath, $targetPath); if (!$move) { $respon = [ "status" => false, "msg" => "Simpan berkas Gambar gagal!", "name" => $NewImageName, "source" => $sourcePath, "location" => $targetPath, "gambar_info" => $gambar, ]; print_r($respon); die(); } }
当前配置信息
- 文件夹权限:目录权限为
drwxr-xr-x(755) - php.ini核心上传配置:
file_uploads = On upload_max_filesize = 2M max_file_uploads = 20
实际响应结果
move_uploaded_file执行返回false,输出的响应内容如下:
status: false
msg: "Simpan berkas Gambar gagal!"
name: 生成的新文件名(格式为gambar+随机数+.+未定义的扩展名)
source: 临时文件路径(存在有效路径)
location: 目标文件完整路径
gambar_info: 完整的$_FILES['img']数组信息
重点排查方向
- 检查上传错误码:在代码开头添加
var_dump($_FILES['img']['error']);,确认上传过程中是否已经出现错误(比如UPLOAD_ERR_INI_SIZE表示文件超上限,UPLOAD_ERR_NO_TMP_DIR表示临时目录缺失等) - 修复未定义变量:代码中
$file_extension未定义,会导致生成的文件名格式异常(如gambar12345678.),这会直接导致写入失败。需要先获取文件扩展名,比如:
$file_extension = pathinfo($gambar["name"], PATHINFO_EXTENSION);
- 验证目录实际可写性:在
mkdir之后添加var_dump(is_writable($folderPath));,确认web服务器进程是否真的拥有该目录的写入权限。755权限下,如果目录所有者不是web进程用户(如www-data),可能会无法写入 - 检查临时文件状态:确认
$sourcePath指向的临时文件是否存在且可读,可添加var_dump(file_exists($sourcePath), is_readable($sourcePath));验证 - 排查SELinux限制:如果是Linux服务器,SELinux可能阻止web进程写入目录。可临时执行
sudo setenforce 0关闭SELinux测试,若能正常上传则需配置SELinux上下文规则 - 确认mkdir的权限参数:当前
mkdir未指定权限,默认会继承父目录权限,可显式添加权限参数mkdir($folderPath, 0755, true);(第三个参数支持递归创建多级目录)
内容的提问来源于stack exchange,提问作者Didie Qaedi
相关产品推荐
相关产品推荐

