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

如何通过PHP实现浏览器直传文件至部署vsftpd的EC2实例?

解决PHP网页上传文件到EC2实例的方案

嘿,我来帮你搞定这个PHP网页上传的问题!你已经把vsftpd和安全组配置得差不多了,现在只需要把PHP上传逻辑和服务器的权限、配置结合起来就行,分几种场景给你梳理:

一、直接通过PHP写入服务器目录(推荐,更高效)

这种方式不需要走FTP协议,直接让PHP把上传的文件写到EC2的目标目录里,步骤如下:

  1. 配置目录权限
    首先得确保PHP运行的用户(通常是Web服务器的用户,比如Amazon Linux上的apache,Ubuntu上的www-data)有目标上传目录的写入权限。假设你想把文件传到/var/www/upload,执行以下命令:
sudo mkdir -p /var/www/upload
sudo chown apache:apache /var/www/upload  # 根据你的Web服务器用户调整,Ubuntu用www-data
sudo chmod 755 /var/www/upload
  1. 编写PHP上传脚本
    创建一个upload.php文件,放到你的Web根目录(比如/var/www/html)里,内容如下:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 定义上传目录
    $targetDir = '/var/www/upload/';
    // 生成目标文件路径(重命名避免覆盖或安全问题)
    $fileName = uniqid() . '-' . basename($_FILES['fileToUpload']['name']);
    $targetFile = $targetDir . $fileName;
    $uploadOk = 1;
    $fileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));

    // 安全检查:限制文件大小(示例为5MB)
    if ($_FILES['fileToUpload']['size'] > 5 * 1024 * 1024) {
        echo "抱歉,文件大小不能超过5MB。";
        $uploadOk = 0;
    }

    // 安全检查:限制允许的文件类型
    $allowedTypes = ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'txt'];
    if (!in_array($fileType, $allowedTypes)) {
        echo "抱歉,只允许上传JPG/PNG/GIF/PDF/TXT格式的文件。";
        $uploadOk = 0;
    }

    // 执行上传
    if ($uploadOk == 1) {
        if (move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $targetFile)) {
            echo "文件 <b>{$fileName}</b> 已成功上传!";
        } else {
            echo "抱歉,上传过程中出现错误,请检查目录权限。";
        }
    }
}
?>

<!-- 上传表单 -->
<form action="upload.php" method="post" enctype="multipart/form-data">
    选择文件:<input type="file" name="fileToUpload" id="fileToUpload" required>
    <br><br>
    <input type="submit" value="上传文件" name="submit">
</form>
  1. 调整PHP配置(可选)
    如果需要上传更大的文件,得修改php.ini里的参数:
  • upload_max_filesize:设置单个文件的最大上传大小(比如10M)
  • post_max_size:设置POST请求的最大大小(要比upload_max_filesize大,比如12M)
    修改后重启Web服务器生效:sudo systemctl restart httpd(Apache)或sudo systemctl restart nginx(Nginx)

二、通过PHP连接vsftpd上传(适合需要FTP协议的场景)

如果你一定要通过FTP协议上传,那需要先创建FTP用户,再用PHP的FTP函数连接传输:

  1. 创建FTP用户
    先创建一个专门的FTP用户,并限制其只能访问指定目录(比如/var/ftp/upload):
sudo useradd -d /var/ftp/upload -s /sbin/nologin ftpuser
sudo passwd ftpuser  # 设置用户密码
sudo mkdir -p /var/ftp/upload
sudo chown ftpuser:ftpuser /var/ftp/upload

同时确保vsftpd配置允许该用户登录,比如在vsftpd.conf里设置:

userlist_enable=NO
allow_writeable_chroot=YES  # 允许用户在chroot目录下写入

重启vsftpd服务:sudo systemctl restart vsftpd

  1. 编写PHP FTP上传脚本
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // FTP服务器信息
    $ftpHost = '54.175.227.189';
    $ftpUser = 'ftpuser';
    $ftpPass = '你设置的ftpuser密码';
    $remoteDir = '/';  // 对应ftpuser的根目录/var/ftp/upload

    // 连接FTP服务器
    $connId = ftp_connect($ftpHost);
    if (!$connId) {
        echo "无法连接到FTP服务器,请检查地址和端口。";
        exit;
    }

    // 登录FTP
    $loginStatus = ftp_login($connId, $ftpUser, $ftpPass);
    if (!$loginStatus) {
        echo "FTP登录失败,请检查用户名和密码。";
        ftp_close($connId);
        exit;
    }

    // 开启被动模式(和你的vsftpd配置匹配)
    ftp_pasv($connId, true);

    // 上传文件
    $localFile = $_FILES['fileToUpload']['tmp_name'];
    $remoteFile = $remoteDir . uniqid() . '-' . basename($_FILES['fileToUpload']['name']);
    $uploadStatus = ftp_put($connId, $remoteFile, $localFile, FTP_BINARY);

    if ($uploadStatus) {
        echo "文件已通过FTP成功上传!";
    } else {
        echo "FTP上传失败,请检查目录权限和被动端口配置。";
    }

    // 关闭FTP连接
    ftp_close($connId);
}
?>

<form action="upload.php" method="post" enctype="multipart/form-data">
    选择文件:<input type="file" name="fileToUpload" id="fileToUpload" required>
    <br><br>
    <input type="submit" value="通过FTP上传" name="submit">
</form>

三、关键注意事项

  • 安全组:除了FTP的被动端口12000-12100,一定要开放Web服务器的端口(80或443),否则浏览器无法访问你的PHP上传页面。
  • SELinux限制:如果EC2开启了SELinux,可能会阻止PHP写入目录,执行以下命令设置SELinux上下文:
    sudo chcon -R -t httpd_sys_rw_content_t /var/www/upload  # 对应直接上传的目录
    # 如果是FTP目录,设置:
    sudo chcon -R -t public_content_rw_t /var/ftp/upload
    
  • 安全防护:一定要做文件类型验证、文件名重命名,避免恶意文件上传(比如不要让用户上传PHP脚本并执行)。

内容的提问来源于stack exchange,提问作者kiteandwindsurfer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:55:49