php核心不定义任何名为upload的常量;upload_err_ok等是上传错误常量,upload_dir等需手动定义,upload_tmp_dir仅为临时存储路径,不可直接用作最终上传目录。

PHP中没有 UPLOAD 常量
直接说结论:PHP 核心不定义任何名为 UPLOAD 的常量。你看到的 UPLOAD 很可能来自自定义常量、框架封装(如 Laravel 的 public_path('uploads'))、或误记了 UPLOAD_ERR_OK 这类错误码常量。
真正和上传路径相关的是运行时行为,不是编译期常量。PHP 本身只管把文件临时存到 upload_tmp_dir 指定的位置(默认系统临时目录),然后由开发者决定移去哪里。
$_FILES 数组里根本没有目标路径
$_FILES['file']['tmp_name'] 是唯一可靠的临时文件路径,它指向服务器上的一个临时文件(比如 /tmp/phpabc123)。这个路径不能直接当“上传目录”用——它会被 PHP 在脚本结束时自动删除。
常见误解是以为 $_FILES['file']['name'] 或 $_FILES['file']['full_path'] 能给出服务端路径,但:
-
['name']只是客户端传来的原始文件名(不可信,需过滤) -
['full_path']并不存在 —— PHP 不提供该键 - 没有机制能自动把文件“保存到某个 UPLOAD 目录”,必须手动
move_uploaded_file()
怎么安全地设置并使用上传目录
你需要自己定义目标目录,并确保权限、存在性、隔离性都到位。典型做法:
- 用绝对路径定义上传根目录,例如:
define('UPLOAD_DIR', __DIR__ . '/uploads/'); - 创建子目录按日期/用户分隔,避免单目录文件过多:
$targetDir = UPLOAD_DIR . date('Y/m/') . $userId . '/'; - 务必提前创建目录并设好权限(Web 用户可写,但不可执行):
mkdir($targetDir, 0755, true); - 校验
$_FILES['file']['error'] === UPLOAD_ERR_OK后再操作,否则跳过 - 用
move_uploaded_file($_FILES['file']['tmp_name'], $targetFile)完成转移
别硬编码相对路径,也别依赖 getcwd() 或 $_SERVER['DOCUMENT_ROOT'] —— 它们在 CLI、FastCGI、不同部署下表现不一致。
为什么不能直接用 upload_tmp_dir 当上传目录
这个 ini 配置项(可通过 ini_get('upload_tmp_dir') 获取)只是 PHP 存放临时文件的地方,有三个硬伤:
- 内容会在请求结束后被清理,无法持久化
- 路径通常不在 Web 可访问范围内,或者干脆在 /tmp 下,没法通过 URL 访问
- 多个请求共享同一临时目录,无隔离,有并发覆盖风险
如果你真想复用临时目录逻辑,至少得在 move_uploaded_file 后立即重命名+移动,而不是把它当成最终存储位置。
最常被忽略的一点:上传目录的父路径不能暴露在 Web 根目录下(比如不要放在 public/uploads/ 里却没做 .htaccess 限制),否则任意文件执行风险极高。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











