php 亚马逊AWS-S3对象存储上传文件

最近做国外项目的时候,需要把文件上传到AWS-S3对象存储空间里,下面整理一下上传方法,和碰到的问题

代码

php 复制代码
 /**
 * 亚马逊oss Aws上传
 * composer require aws/aws-sdk-php
 * @param $filePath
 * @param $ossPath
 * @return array
 * @author wzb
 * @data 2024/5/25
 */
function ossAwsUploadFile($filePath = '', $ossPath = '')
{
    // 配置信息  composer require aws/aws-sdk-php
    $configOss = config('aws_oss');
    $accessKeyId = $configOss['accessKeyId'] ?? '';  // 你的AccessKeyId
    $accessKeySecret = $configOss['accessKeySecret'] ?? '';  // 你的AccessKeySecret
    $endpoint = $configOss['region'] ?? ''; // 你的Bucket所在地域的域名 ap-southeast-1
    $bucket = $configOss['bucket'] ?? ''; // 你的Bucket名字
    if (empty($accessKeyId) || empty($accessKeySecret) || empty($endpoint) || empty($bucket)) {
        return [];
    }
    $awsConfig = [
        'version' => 'latest',//版本
        'acl' => 'public-read',//权限//这个一定要加,是访问权限
        'bucket' => $bucket,//存储桶名称
        'region' => $endpoint,
        'key_id' => $accessKeyId,//Access key ID
        'access_key' => $accessKeySecret,//Secret access key
    ];
    //实例化
    $s3 = new S3Client([
        'version' => $awsConfig['version'],//版本
        'region' => $awsConfig['region'],//区域
        'credentials' => new Credentials(
            $awsConfig['key_id'],
            $awsConfig['access_key']
        ),
        // 开启bug调试
//            'debug' => true
    ]);
    if (!file_exists($filePath)) {
        return [];
    }
    try {
        $result = $s3->putObject([
            'Bucket' => $awsConfig['bucket'],
            'ACL' => $awsConfig['acl'],//这个一定要加,是访问权限
            'Key' => $ossPath,   // //亚马逊静态资源服务器上的路径+图片名称
//                'Body' => fopen($filePath, 'r'),
            'SourceFile' => $filePath,  // 原文件路径
        ]);
        $result = $result->toArray();
        $imgUrl = $result['ObjectURL'] ?? '';
        return $result;
    } catch (Exception $exception) {
        echo $exception->getMessage();
        return [];
    }
}

// 调用示例
 $ossInfo = ossAwsUploadFile("F:/wzb/img/5836923c44342.jpg", 'img/5836923c44342.jpg');

碰到的问题

一直报AWS HTTP error: cURL error 60: SSL certificate problem: unable to get local issuer certificate的问题:

下面详细报错信息:

PutObject" on "https://ss.amazonaws.com/img/5836923c44342.jpg"; AWS HTTP error: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://ss.amazonaws.com/img/5836923c44342.jpg

解决办法

php.ini里面的 curl.cainfo 需要设置

  1. 下载cacert: https://curl.haxx.se/ca/cacert.pem

  2. 配置php.ini 并重启

php 复制代码
curl.cainfo = "真实路径/cacert.pem"
相关推荐
CYRUS_STUDIO1 小时前
利用 Linux 信号机制(SIGTRAP)实现 Android 下的反调试
android·安全·逆向
CYRUS_STUDIO1 小时前
Android 反调试攻防实战:多重检测手段解析与内核级绕过方案
android·操作系统·逆向
黄林晴5 小时前
如何判断手机是否是纯血鸿蒙系统
android
火柴就是我5 小时前
flutter 之真手势冲突处理
android·flutter
法的空间5 小时前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
循环不息优化不止6 小时前
深入解析安卓 Handle 机制
android
Bruce1236 小时前
web专题之php代审(二)
php
恋猫de小郭6 小时前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter
jctech6 小时前
这才是2025年的插件化!ComboLite 2.0:为Compose开发者带来极致“爽”感
android·开源
用户2018792831676 小时前
为何Handler的postDelayed不适合精准定时任务?
android