AWS EC2 Ubuntu实例文件上传失败问题求助
排查EC2上PHP文件上传无文件保存问题
以下是针对性的排查和解决步骤:
1. 修正Web服务器权限归属
EC2上的Apache/Nginx默认运行用户并非ubuntu,Apache一般用www-data,Nginx用nginx。你之前给ubuntu用户设置权限,但PHP是通过Web服务器进程执行的,权限需要对应到服务运行用户:
# 若使用Apache sudo chown -R www-data:www-data /var/www/html # 若使用Nginx sudo chown -R nginx:nginx /var/www/html
同时目录需要开放写入权限给服务用户组:
sudo chmod -R 775 /var/www/html
2. 指定绝对文件路径
你的代码使用相对路径写入文件,PHP会把文件放到当前工作目录(不一定是/var/www/html),改成绝对路径明确写入位置:
<?php $image = $_POST['image']; $name = $_POST['name']; $realImage = base64_decode($image); // 明确指定保存到/var/www/html目录下 $savePath = '/var/www/html/' . $name; // 写入成功才返回OK,否则返回失败并记录日志 if(file_put_contents($savePath, $realImage)){ echo "OK"; } else { echo "FAIL"; error_log("写入失败:" . $savePath); } ?>
3. 查看错误日志找具体原因
这是定位问题最直接的方式:
- Apache错误日志路径:
/var/log/apache2/error.log - 临时开启PHP错误输出(仅测试用):
<?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // 原有代码 ?>
上传后查看日志,会明确显示权限不足、路径不存在、base64解码失败等具体问题。
4. 检查SELinux限制
AWS EC2部分系统默认开启SELinux,即使文件权限正确,也会阻止Web进程写入。临时关闭测试:
sudo setenforce 0
如果能正常保存,说明是SELinux的问题,设置永久允许规则:
sudo chcon -R -t httpd_sys_rw_content_t /var/www/html
5. 验证上传数据有效性
有可能$_POST['image']是空值或无效base64字符串,导致写入空文件或失败。添加验证逻辑:
<?php $image = $_POST['image'] ?? ''; $name = $_POST['name'] ?? ''; if(empty($image) || empty($name)){ echo "参数缺失"; exit; } // 开启严格模式,解码失败返回false $realImage = base64_decode($image, true); if($realImage === false){ echo "无效的base64数据"; exit; } $savePath = '/var/www/html/' . $name; file_put_contents($savePath, $realImage) ? echo "OK" : echo "写入失败"; ?>
内容的提问来源于stack exchange,提问作者mvasco
相关产品推荐
相关产品推荐

