如何用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
相关产品推荐
相关产品推荐

