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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:45:03