使用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.
核心修复步骤
- 提前创建用户专属上传目录
在尝试移动文件前,先检查并递归创建所需的目录结构,确保PHP有写入权限。 - 修正路径处理逻辑
你不需要用mysqli_real_escape_string处理本地文件路径,只需要在将路径存入数据库时进行转义即可。 - 增加错误校验
对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
相关产品推荐
相关产品推荐

