图片不显示主因是文件未存至web可访问路径或html的src路径不匹配url规则;需确认$targetdir在documentroot下、浏览器能直接访问该url、php-fpm配置生效且权限正确。

上传图片后不显示,问题通常不在“上传动作”本身,而在于图片是否真的存到了 Web 可访问路径,以及HTML 中的 src 路径能否被浏览器正确请求到。PHP 8.2 没有改变这个底层逻辑,但配置和权限细节更严格了。
确认图片是否成功落盘且可被 Web 访问
很多情况下,move_uploaded_file() 返回 true,只是说明文件从临时目录移到了服务器某个磁盘路径,但那个路径可能根本不在 Web 根目录下,或者没有被 Web 服务器(如 Nginx/Apache)配置为公开资源目录。
- 检查你代码里写的
$targetDir,比如/var/www/html/uploads/—— 这个路径必须是 Web 服务器 DocumentRoot 下的子目录,否则浏览器无法通过 HTTP 直接访问 - 用 SSH 登录服务器,执行
ls -l /var/www/html/uploads/your_image.jpg,确认文件确实存在、大小非零 - 直接在浏览器地址栏输入
https://yoursite.com/uploads/your_image.jpg,看是否能下载或显示图片。如果 404,说明路径没暴露给 Web;如果 403,说明权限或 Web 服务器配置限制了访问
检查 PHP 配置是否真正生效(尤其 php-fpm 场景)
PHP CLI 和 PHP-FPM 使用的是两套独立的 php.ini。你在 /etc/php/8.2/cli/php.ini 改了 upload_max_filesize,对网页上传毫无作用。
- 在上传页面同目录下建一个
info.php,内容为<?php phpinfo(); ?>,访问它,搜索 “Loaded Configuration File”,确认看到的是/etc/php/8.2/fpm/php.ini - 重点核对以下三项是否一致且足够大:
upload_max_filesize、post_max_size(需 ≥ upload_max_filesize)、max_execution_time(大图处理可能超时) - 改完 fpm 的 php.ini 后,必须执行
sudo systemctl restart php8.2-fpm(或对应服务名),不是只 reload nginx
验证 HTML 中的 img src 路径是否匹配 URL 规则
PHP 脚本里的 __DIR__ 或 ./uploads/ 是服务器文件系统路径;而 <img src="..."> 的值是浏览器发起 HTTP 请求的 URL 路径,二者完全不等价。
- 错误写法:
<img src="./uploads/<?php%20echo%20%24filename;%20?>">——./在浏览器里是相对于当前页面 URL,不是脚本位置 - 推荐写法:
<img src="/uploads/<?php%20echo%20htmlspecialchars(%24filename);%20?>">(根相对路径,前提是 uploads 文件夹在 Web 根目录下) - 更稳妥做法:定义一个常量或变量表示 Web 可访问的图片基础路径,例如
define('ASSET_URL', '/uploads');,然后<img src="<?=%20ASSET_URL%20?>/<?=%20%24filename%20?>">
排查文件权限与 Web 服务器限制
即使文件存在,Nginx/Apache 也可能因权限或安全策略拒绝提供服务。
- 确保 uploads 目录权限为
755,图片文件为644:运行chmod -R 755 /var/www/html/uploads - Nginx 用户(通常是
www-data或nginx)必须对 uploads 目录有读取权限;Apache 同理 - 检查 Nginx 配置中是否有类似
location ~ \.php$ { ... }的规则意外拦截了 .jpg/.png 请求;或是否启用了autoindex off;导致目录不可列,但这不影响单个文件访问 - 某些主机环境禁用上传目录执行 PHP,这是好事,但要确认它没连带禁止静态文件服务 —— 检查是否有
deny all;错误地应用在了 uploads location 块里
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











