如何用PHP接收Swift上传的图片与参数并上传到AWS S3
PHP端接收Swift上传请求并同步到AWS S3+MySQL实现方案
前置依赖
- 服务器需安装PHP >= 7.2,开启
pdo_mysql、curl扩展 - 使用Composer安装AWS官方SDK:
composer require aws/aws-sdk-php
核心逻辑说明
你Swift代码里提交的3个字段PHP可以直接通过原生全局变量解析,无需手动处理multipart边界:
- 普通文本参数
nomeDb、codFiscale通过$_POST获取 - 图片文件通过
$_FILES['file']获取
完整实现代码
<?php // 引入Composer自动加载文件 require 'vendor/autoload.php'; use Aws\S3\S3Client; use Aws\Exception\AwsException; // 配置项(建议改为环境变量读取,不要硬编码密钥) $s3Config = [ 'version' => 'latest', 'region' => '你的S3区域,比如ap-northeast-1', 'credentials' => [ 'key' => '你的AWS_ACCESS_KEY_ID', 'secret' => '你的AWS_SECRET_ACCESS_KEY', ], ]; $bucketName = '你的S3桶名'; $mysqlConfig = [ 'host' => '数据库地址', 'dbname' => '数据库名', 'username' => '数据库账号', 'password' => '数据库密码', 'charset' => 'utf8mb4' ]; header('Content-Type: text/plain; charset=utf-8'); try { // 1. 校验参数 if (!isset($_POST['nomeDb'], $_POST['codFiscale'], $_FILES['file'])) { throw new Exception('缺少必填参数'); } if ($_FILES['file']['error'] !== UPLOAD_ERR_OK) { throw new Exception('文件上传失败,错误码:' . $_FILES['file']['error']); } // 可选:校验文件类型,防止恶意上传 $allowMime = ['image/png', 'image/jpeg', 'image/jpg']; if (!in_array($_FILES['file']['type'], $allowMime)) { throw new Exception('仅允许上传PNG/JPG格式图片'); } // 2. 上传到S3 $s3 = new S3Client($s3Config); $fileName = uniqid() . '_' . $_FILES['file']['name']; // 生成唯一文件名避免覆盖 $result = $s3->putObject([ 'Bucket' => $bucketName, 'Key' => $fileName, 'SourceFile' => $_FILES['file']['tmp_name'], 'ACL' => 'public-read', // 如果不需要公开访问可删除这行 'ContentType' => $_FILES['file']['type'] ]); $s3FileUrl = $result['ObjectURL']; // 3. 写入MySQL $dsn = "mysql:host={$mysqlConfig['host']};dbname={$mysqlConfig['dbname']};charset={$mysqlConfig['charset']}"; $pdo = new PDO($dsn, $mysqlConfig['username'], $mysqlConfig['password']); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 注意替换为你实际的表名和字段名 $stmt = $pdo->prepare("INSERT INTO 你的表名 (nome_db, cod_fiscale, s3_url, upload_time) VALUES (?, ?, ?, ?)"); $stmt->execute([ $_POST['nomeDb'], $_POST['codFiscale'], $s3FileUrl, date('Y-m-d H:i:s') ]); // 4. 返回S3地址给Swift端 echo $s3FileUrl; } catch (Exception $e) { http_response_code(400); echo $e->getMessage(); } ?>
注意事项
- AWS密钥禁止硬编码在代码中,建议通过服务器环境变量、AWS IAM角色等方式获取,避免密钥泄露
- 需提前配置S3桶的CORS规则,允许你的客户端域名访问
- PHP.ini中要调整
upload_max_filesize、post_max_size参数匹配你的图片大小限制 - 生产环境建议增加请求频率限制、用户身份校验逻辑,防止接口被滥用
内容的提问来源于stack exchange,提问作者Stefano
相关产品推荐
相关产品推荐

