OpenCart在XAMPP图片上传失败90%因DIR_STORAGE路径错误、uploads/目录未手动创建或Android端未启用android:usesCleartextTraffic="true";需确保storage子目录完整、权限开放且HTTP协议正确。

OpenCart 在 XAMPP 上图片上传失败,90% 是 DIR_STORAGE 路径错误或 uploads/ 目录权限缺失,不是 Apache 配置或 PHP 版本问题。
upload.php 里没建 uploads/ 目录就直接 move_uploaded_file()
Android 或 Web 前端传图时,upload.php 默认写法会直接调用 move_uploaded_file() 到 uploads/,但 XAMPP 的 C:\xampp\htdocs\projects\ 下根本不存在这个子目录 —— 所以函数静默失败,$_FILES['files']['error'] 返回 UPLOAD_ERR_NO_FILE 或 UPLOAD_ERR_CANT_WRITE,而原始脚本又不校验,导致前端以为“上传成功”。
- 必须手动在
C:\xampp\htdocs\projects\下执行mkdir uploads(Windows 命令行)或用资源管理器新建文件夹 - 确认该
uploads/目录属性里,“安全”页签中SYSTEM(Apache 默认运行用户)有“写入”权限;若用的是 XAMPP 控制面板启动的 Apache,通常不需要改用户,但权限必须开 - 不要依赖 PHP 自动创建目录:即使加了
is_dir() && mkdir(),也得确保父目录可写,不如手动建好更稳
OpenCart 后台上传产品图报 fopen() failed:DIR_STORAGE 指向错误
错误信息如 Warning: fopen(C:/xampp/storage/logs/error.log): Failed to open stream,说明 OpenCart 尝试往 DIR_STORAGE 拼出的路径写日志,但路径根本不存在,或子目录(logs/、image/、cache/)没初始化。
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
-
DIR_STORAGE必须是绝对路径,且结尾带斜杠,例如define('DIR_STORAGE', 'C:/xampp/storage/');—— 注意 Windows 下用正斜杠/更兼容,反斜杠\容易被 PHP 当转义符处理 - 该路径下必须存在
logs/、image/、cache/、download/、modification/这 5 个子目录,缺一个都会在对应功能(上传图、清缓存、装插件)时报错 - 如果把
storage放在C:/xampp/storage/,就要同步修改config.php和admin/config.php两处,漏改admin/config.php是最常见失误
Apache 不让写入 uploads/ 或 storage/:httpd.conf 的 AllowOverride 和权限控制
即使目录存在、权限给了,Apache 仍可能拒绝写入,典型表现是上传时返回 403 或空白页,error.log 里出现 Permission denied。
- 打开
C:\xampp\apache\conf\httpd.conf,确认LoadModule rewrite_module modules/mod_rewrite.so这行前面没有# - 找到
<Directory "C:/xampp/htdocs">区块,把里面的AllowOverride None改成AllowOverride All,否则 OpenCart 的.htaccess重写规则(包括上传路由)会被忽略 - 如果用了虚拟主机(vhost),还要检查对应
<VirtualHost>块里是否重复写了<Directory>并设了Require all denied—— 这种配置会覆盖全局,必须显式改成Require all granted
Android 端上传图片到 XAMPP:HTTP 协议 + cleartextTraffic 是硬性前提
Android 9(API 28)起默认禁用明文 HTTP 请求,如果你的 upload.php 地址是 http://192.168.1.100/projects/upload.php,但没声明允许明文流量,OkHttp 会直接丢弃请求,onResponse() 根本不触发,doInBackground() 却返回 true,造成“假成功”。
- 在
AndroidManifest.xml的<application>标签里加属性:android:usesCleartextTraffic="true" - 确保 Android 设备和 XAMPP 机器在同一局域网,且防火墙放行了目标端口(默认 80)
- 别用
localhost或127.0.0.1:这是设备自身回环地址,XAMPP 服务不在 Android 上运行;必须用 XAMPP 所在电脑的真实局域网 IP(如192.168.1.100)
DIR_STORAGE 路径拼错、uploads/ 目录没手动创建、Android 端没开 cleartextTraffic —— 这三个点只要漏一个,上传就会“看起来成功,实际没文件”。调试时优先盯死这三处,比查 Apache 日志更快。

















