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

使用PHP+jQuery Ajax实现图片上传时的路径问题求助

问题分析与解决方案

Hey there, let's break down your issue first—those error messages are telling you exactly what's wrong: the target upload directory doesn't exist. When you try to save the file to uploaded_pictures/uploads/20/499297822.jpg, the 20 subfolder (matching your user ID) hasn't been created yet. PHP can't write to a directory that doesn't exist, so move_uploaded_file fails, and all subsequent steps (like generating thumbnails) break because the source file never makes it to the intended path.

核心修复步骤

  1. 提前创建用户专属上传目录
    在尝试移动文件前,先检查并递归创建所需的目录结构,确保PHP有写入权限。
  2. 修正路径处理逻辑
    你不需要用mysqli_real_escape_string处理本地文件路径,只需要在将路径存入数据库时进行转义即可。
  3. 增加错误校验
    对move_uploaded_file的返回值做判断,确保文件移动成功后再执行缩略图生成和数据库插入操作。

修改后的完整代码

if(isset($_POST['discussion_title'], $_POST['discussion_subjects'], $_POST['discussion_textarea'])) { 
    $user_id = (int)$_SESSION['user_id']; 
    $title = mysql_prep($_POST['discussion_title']); 
    $link = mysql_prep($_POST['discussion_link']); 
    $subject = mysql_prep($_POST['discussion_subjects']); 
    $discussion = mysql_prep($_POST['discussion_textarea']); 
    $discussion_timestamp = time(); 

    if ($_FILES["discussion_image"]["name"] != "") { 
        $test = explode(".", $_FILES["discussion_image"]["name"]); 
        $extension = end($test); 
        $name = rand(100, 9999999999); 
        $file_temp = $_FILES['discussion_image']['tmp_name']; 
        
        // 定义基础上传目录和用户子目录
        $base_upload_dir = 'uploaded_pictures/uploads/';
        $user_upload_dir = $base_upload_dir . $user_id . '/';
        
        // 递归创建目录(父目录不存在时自动创建),设置权限为0755
        if (!is_dir($user_upload_dir)) {
            mkdir($user_upload_dir, 0755, true);
        }
        
        // 构建本地文件路径(无需转义,这是文件系统路径)
        $file_path = $user_upload_dir . $name . '.' . $extension; 
        
        // 移动文件并检查是否成功
        if (move_uploaded_file($file_temp, $file_path)) {
            $save_path_small = $user_upload_dir . $name . 'small.' . $extension; 
            
            // 生成缩略图
            create_thumbnail($file_path, $file_path, 250, 250); 
            create_thumbnail($file_path, $save_path_small, 50, 50); 
            
            // 存入数据库前转义路径
            $escaped_file_path = mysqli_real_escape_string($connection, $file_path);
            $query = "INSERT INTO discussions_table (user_id, title, link, image_link, subject, discussion, discussion_timestamp) VALUES ($user_id, '$title', '$link', '$escaped_file_path', '$subject', '$discussion', $discussion_timestamp)";
        } else {
            // 处理文件上传失败的情况
            die('文件上传失败,请检查目录权限或上传配置');
        }
    } else { 
        $query = "INSERT INTO discussions_table (user_id, title, link, subject, discussion, discussion_timestamp) VALUES ($user_id, '$title', '$link', '$subject', '$discussion', $discussion_timestamp)"; 
    } 

    $result = mysqli_query($connection, $query); 
}

额外注意事项

  • 权限检查:确保Web服务器进程(比如Apache的www-data用户)对uploaded_pictures/目录有写入权限,否则即使目录存在也无法写入文件。
  • 文件类型验证:目前仅检查文件名非空,建议增加文件类型和大小校验(比如只允许jpg、png等图片格式),避免上传恶意文件。
  • 随机文件名优化:可以用uniqid($user_id, true)替代rand(),生成更唯一的文件名,避免重复覆盖。

内容的提问来源于stack exchange,提问作者firashelou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:06:18