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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:54:04