PHP上传商品图片存入MySQL时无法移动到目标目录问题求助
问题根因
你的错误是生成文件名时错误使用了路径分隔符导致的:
代码中$image_rename = 'prod_'.date('Y/m/d')."_".$image_rand;这行用/作为日期的分隔符,而/在所有操作系统中都会被识别为目录层级分隔符。系统会将目标路径../images/products/prod_2021/12/05_819609249.jpg解析为:在products目录下先找到prod_2021目录,再进入其下的12目录,最后把文件存为05_819609249.jpg,由于你没有提前创建这些自动生成的层级目录,就会触发「找不到文件或目录」的报错。
你其他表单逻辑正常,大概率是其他表单的文件名生成规则没有用到带/的字符,不会额外生成层级目录需求。
解决方案
方案1:直接修改日期分隔符(最简单)
把日期的分隔符替换为不会被识别为路径的横杠或下划线即可,修改代码:
// 原代码 // $image_rename = 'prod_'.date('Y/m/d')."_".$image_rand; // 修改为 $image_rename = 'prod_'.date('Y-m-d')."_".$image_rand;
修改后文件名不会携带路径分隔符,会直接存入你预先创建好的../images/products/目录下。
方案2:保留按年月日分类存储的逻辑
如果你确实需要按日期层级存储图片,先添加递归创建目录的逻辑即可,修改代码:
$image_extension = pathinfo($cover_image, PATHINFO_EXTENSION); $image_rand = rand(time(), 100000000); // 按日期生成目录路径 $date_path = date('Y/m/d/'); $upload_root = "../images/products/"; // 递归创建不存在的目录 if (!file_exists($upload_root . $date_path)) { mkdir($upload_root . $date_path, 0755, true); } // 生成最终存储路径和文件名 $image_new_name = "prod_" . $image_rand . "." . $image_extension; $new_location = $upload_root . $date_path . $image_new_name; // 存入数据库的product_image字段可以保留完整相对路径,方便后续读取 $db_image_path = $date_path . $image_new_name;
辅助验证
你可以在move_uploaded_file执行前添加调试代码打印目标路径,确认路径是否符合预期:
var_dump($new_location);die;
执行后就能直观看到文件名是否携带了多余的路径分隔符。
内容的提问来源于stack exchange,提问作者Sam Akins
相关产品推荐
相关产品推荐

