You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:32:26