PHP多目录上传图片异常:仅uploaded目录成功,其余目录失效
问题分析与解决方案
核心问题
- 临时文件被移动后失效:执行
move_uploaded_file后,PHP会自动删除上传的临时文件($_FILES['image']['tmp_name']指向的文件),后续用这个路径调用copy必然失败。 - 缩略图处理逻辑错误:如果
resize_image返回的是GD图像资源,直接传给copy函数无效——copy要求第一个参数必须是文件路径,而非资源对象。
修正后的代码
if($category == "Ogłoszenia"){ $file_image = time() . "_" . $_FILES['image']['name']; $tmp = $_FILES['image']['tmp_name']; // 1. 先复制原文件到uploaded目录,保留临时文件 copy($tmp, "uploaded/".$file_image); // 2. 复制原文件到子域名目标目录 copy($tmp, "../../../subdomena/bip/files/pl/".$file_image); // 3. 生成缩略图并保存到指定路径 $thumb_name = "thumb_".$file_image; $local_thumb_path = "uploaded/".$thumb_name; // 修改resize_image函数,让它接收保存路径参数 resize_image($tmp, 150, 150, $local_thumb_path); // 复制缩略图到子域名目录 copy($local_thumb_path, "../../../subdomena/bip/files/pl/".$thumb_name); // 可选:删除本地临时缩略图 unlink($local_thumb_path); // 可选:手动清理原临时文件(PHP脚本结束后也会自动清理) unlink($tmp); } else { $file_image = time() . "_" . $_FILES['image']['name']; $tmp = $_FILES['image']['tmp_name']; move_uploaded_file($tmp, "uploaded/".$file_image); }
关键修改说明
- 调整操作顺序:先用
copy完成所有依赖原临时文件的操作,最后再清理临时文件,避免临时文件提前失效。 - 修复缩略图生成逻辑:修改
resize_image函数,让它直接将处理后的缩略图保存到指定文件路径,示例参考:
function resize_image($sourcePath, $targetWidth, $targetHeight, $savePath) { // 获取原图片类型与尺寸 $imgInfo = getimagesize($sourcePath); $imgType = image_type_to_extension($imgInfo[2], false); // 创建原图像资源 $createFunc = "imagecreatefrom{$imgType}"; $sourceImg = $createFunc($sourcePath); // 创建缩略图画布 $targetImg = imagecreatetruecolor($targetWidth, $targetHeight); // 缩放图像 imagecopyresampled($targetImg, $sourceImg, 0, 0, 0, 0, $targetWidth, $targetHeight, $imgInfo[0], $imgInfo[1]); // 保存缩略图 $outputFunc = "image{$imgType}"; $outputFunc($targetImg, $savePath); // 释放资源 imagedestroy($sourceImg); imagedestroy($targetImg); return $savePath; }
额外排查点
- 验证目标路径有效性:用
realpath("../../../subdomena/bip/files/pl/")输出实际路径,确认目录存在且有写入权限。 - 开启错误提示:在代码开头添加
error_reporting(E_ALL); ini_set('display_errors', 1);,查看是否有隐藏的路径、权限类错误。
内容的提问来源于stack exchange,提问作者Radosław Gzyl
相关产品推荐
相关产品推荐

