PHP图片上传失效八成因临时目录不可写或磁盘满,需检查upload_tmp_dir路径是否存在、权限是否正确(PHP进程用户需读写执行)、SELinux上下文是否合规,并确认磁盘空间未耗尽,改配置后须重启Web服务。

PHP图片上传失效,八成是临时目录不可写或磁盘满——不是代码问题,先别改逻辑。
upload_tmp_dir 目录不存在或权限不对
PHP上传文件时,move_uploaded_file() 前必须先把文件存进系统临时目录(由 upload_tmp_dir 指定),如果这个路径压根不存在、没写权限、或被SELinux/AppArmor拦截,$_FILES['xxx']['error'] 就会返回 UPLOAD_ERR_CANT_WRITE(错误码 7)或直接静默失败。
- 用
php -r "echo sys_get_temp_dir();"查当前实际使用的临时路径,别只信 php.ini 里写的 - 检查该路径是否存在:
ls -ld /var/tmp或dir C:\PHP\temp(Windows) - 确认 PHP 进程用户(如
www-data、apache、IIS_IUSRS)对该目录有读+写+执行权限(Linux 需要 x 权限才能进入目录) - 若用了 SELinux,运行
ls -Z /path/to/tmp,确保上下文是httpd_tmp_t或类似;否则chcon -t httpd_tmp_t /path/to/tmp
upload_tmp_dir 被注释或指向了不可写位置
很多迁移后的问题出在 php.ini 里:要么 upload_tmp_dir 行前面还有分号 ;,要么它被设成了 /tmp 这种看似通用但实际被容器/云主机限制的路径。
- 打开 php.ini,搜索
upload_tmp_dir,确认它没被注释,且值是绝对路径,例如:upload_tmp_dir = "/var/www/php-tmp" - 手动创建该目录:
mkdir -p /var/www/php-tmp,再赋权:chown www-data:www-data /var/www/php-tmp && chmod 755 /var/www/php-tmp - Windows IIS 下注意路径分隔符用正斜杠或双反斜杠:
upload_tmp_dir = "C:/PHP/tmp",并给IIS_IUSRS用户赋予该目录“修改”权限 - 改完必须重启 Web 服务(
systemctl restart apache2或iisreset),phpinfo()页面里要看到生效的值
磁盘空间耗尽导致 tmp 写入失败
临时目录所在分区满(尤其是 /tmp 或 /var/tmp),会导致 move_uploaded_file() 失败,但错误码可能仍是 UPLOAD_ERR_CANT_WRITE,容易误判为权限问题。
立即学习“PHP免费学习笔记(深入)”;
- 运行
df -h(Linux)或查看 Windows 磁盘属性,重点看upload_tmp_dir所在分区使用率是否 ≥95% - 清理旧临时文件:
find /var/tmp -type f -mtime +7 -delete(谨慎执行,先find ... -print预览) - 某些云主机(如 AWS EC2)的
/tmp是内存挂载(tmpfs),大小固定且极易占满,务必改用持久化路径如/var/www/php-tmp - PHP 错误日志(
/var/log/apache2/error.log或php_error.log)里若出现No space left on device,就是它了
临时目录和磁盘空间这两块,是迁移后最常被忽略的底层依赖。哪怕你把上传目录权限、表单 enctype、GD 库全配对了,只要 sys_get_temp_dir() 返回的路径不可写或已满,$_FILES 就永远拿不到合法的 tmp_name —— 后面所有逻辑都白搭。



















