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

如何用PHP实现从浏览器直接批量上传文件至AWS S3存储桶?

没问题,我帮你把单文件上传到AWS S3的方案改成支持多文件上传的版本,步骤清晰,咱们一步步来:

实现多文件直接上传到AWS S3的Web表单方案

1. 调整HTML表单,支持多文件选择

首先把单文件输入框改成支持多选的形式,只需要加multiple属性,同时把name改成数组格式files[],这样前端就能一次性选择多个文件:

<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="files[]" multiple>
    <button type="submit">批量上传文件</button>
</form>

2. 修改PHP后端,处理多文件上传逻辑

原来的单文件逻辑是针对$_FILES['file'],现在要遍历$_FILES['files']数组来处理每个文件。这里推荐使用AWS PHP SDK v3(更稳定安全),先确保你已经通过Composer安装了SDK:

composer require aws/aws-sdk-php

然后修改PHP代码,逐个处理上传的文件并推送到S3:

<?php
require 'vendor/autoload.php';

use Aws\S3\S3Client;
use Aws\Exception\AwsException;

// 配置你的AWS凭证和存储桶信息
$access_key = "你的IAM用户访问密钥";
$secret_key = "你的IAM用户秘密密钥";
$my_bucket = "你的存储桶名称";
$region = "你的存储桶区域(比如us-east-1)";
$success_redirect = 'http://' . $_SERVER['SERVER_NAME'] . '/upload-success.php'; // 上传成功后的跳转页

// 初始化S3客户端
$s3Client = new S3Client([
    'version' => 'latest',
    'region'  => $region,
    'credentials' => [
        'key'    => $access_key,
        'secret' => $secret_key,
    ]
]);

// 处理多文件上传请求
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['files'])) {
    $uploadedFiles = $_FILES['files'];
    $uploadResults = [];

    // 遍历每个上传的文件
    for ($i = 0; $i < count($uploadedFiles['name']); $i++) {
        $fileName = $uploadedFiles['name'][$i];
        $fileTmpPath = $uploadedFiles['tmp_name'][$i];
        $fileError = $uploadedFiles['error'][$i];

        // 跳过上传出错的文件
        if ($fileError !== UPLOAD_ERR_OK) {
            $uploadResults[] = "文件「$fileName」上传失败,错误码:$fileError";
            continue;
        }

        // 可选:添加文件类型/大小验证
        $allowedTypes = ['image/jpeg', 'image/png', 'application/pdf'];
        if (!in_array($uploadedFiles['type'][$i], $allowedTypes)) {
            $uploadResults[] = "文件「$fileName」类型不允许,仅支持JPG/PNG/PDF";
            continue;
        }

        // 上传到S3存储桶
        try {
            // 可以自定义存储路径,比如加个uploads前缀,避免根目录混乱
            $s3Key = 'uploads/' . uniqid() . '-' . $fileName; 
            $result = $s3Client->putObject([
                'Bucket' => $my_bucket,
                'Key'    => $s3Key,
                'Body'   => fopen($fileTmpPath, 'rb'),
                'ACL'    => 'public-read' // 根据需求设置权限,比如private
            ]);

            $uploadResults[] = "文件「$fileName」上传成功,访问链接:" . $result['ObjectURL'];
        } catch (AwsException $e) {
            $uploadResults[] = "文件「$fileName」上传失败:" . $e->getMessage();
        }
    }

    // 把上传结果存到会话,跳转后显示
    session_start();
    $_SESSION['upload_results'] = $uploadResults;
    header("Location: $success_redirect");
    exit;
}
?>

3. 上传结果展示页面(可选)

创建upload-success.php来展示每个文件的上传状态:

<?php
session_start();
?>
<!DOCTYPE html>
<html>
<head>
    <title>上传结果</title>
</head>
<body>
    <h1>批量上传结果</h1>
    <ul>
        <?php foreach ($_SESSION['upload_results'] as $result): ?>
            <li><?php echo $result; ?></li>
        <?php endforeach; ?>
    </ul>
    <?php unset($_SESSION['upload_results']); ?>
</body>
</html>

重要注意事项

  • IAM权限安全:一定要用IAM子用户凭证,给用户只分配s3:PutObject权限,绝对不要用AWS根账户凭证!
  • 文件大小限制:修改PHP配置文件php.ini,调整upload_max_filesize和post_max_size(比如设为10M和20M),避免大文件上传失败。
  • 文件名安全:建议用uniqid()生成随机前缀,避免重名文件覆盖,同时过滤掉文件名里的特殊字符。
  • 直接上传优化:如果不想通过你的服务器中转(浏览器直接传S3),可以生成预签名表单,多文件场景下需要给每个文件生成预签名,适合大文件批量上传。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:25:44