You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP多目录上传图片异常:仅uploaded目录成功,其余目录失效

问题分析与解决方案

核心问题

  1. 临时文件被移动后失效:执行move_uploaded_file后,PHP会自动删除上传的临时文件($_FILES['image']['tmp_name']指向的文件),后续用这个路径调用copy必然失败。
  2. 缩略图处理逻辑错误:如果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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:10:17