前言

最近项目需要用到对象存储,将所有上传文件,存储到BOS云存储上。在开发过程中,遇到一些小小的问题,做个简单记录。

功能实现

1 下载sdk(以下两种方式,任选其一即可)

(1)使用composer 安装

composer require aws/aws-sdk-php

(2) 下载aws.phar

2 项目中使用,代码实现。

<?php
    // sdk
    $bucket = 'upload'; // 容器名称[调整填写自己的容器名称]
    $key = 'index.html'; // 要上传的文件
    $region = 'us-east-1';//地区
    $endpoint = 'https://obs-hazz.cucloud.cn';//
    $ak = 'XXXXXXXXXXXXXXXXXXXXXXXXXX';// ak
    $sk = 'XXXXXXXXXXXXXXXXXXXXXXXXXX';// sk

    // https://github.com/aws/aws-sdk-php
    include 'aws.phar';

    // Register S3 Client
    $s3 = new Aws\S3\S3Client([
        'version' => 'latest',
        's3ForcePathStyle' => true,
        'region' => $region,
        'endpoint' => $endpoint,
        'credentials' => [
            'key' => $ak,
            'secret' => $sk,
        ],
        // 'scheme' => 'http',
        // 'debug' => true,
    ]);


    // Put data to S3 bucket
    try
    {
        $key = '5.jpg';
        $s3->putObject([
            'Bucket' => $bucket,
            'Key'    => $key,
            'Body'   => fopen($key,"r"),
        ]);
    }
    catch (Aws\S3\Exception\S3Exception $e) {
        exit('Error: ' . $e->getAwsErrorMessage() . PHP_EOL);
    }


    // GET Object
    try
    {
        $result = $s3->getObject([
            'Bucket' => $bucket,
            'Key'    => $key
        ]);
        echo "\n---BEGIN---\n";
        echo $result['Body'];
        echo "\n----END----\n\n";
    }
    catch (Aws\S3\Exception\S3Exception $e) {
        exit('Error: ' . $e->getAwsErrorMessage() . PHP_EOL);
    }


    // GET Object head
    try
    {
        $result = $s3->headObject([
            'Bucket' => $bucket,
            'Key'    => $key,
        ]);
        echo "\n---BEGIN---\n";
        echo $result->get("LastModified");
        echo $result->get("ContentLength");
        echo $result->get("AcceptRanges");
        echo "\n----END----\n\n";
    }
    catch (Aws\S3\Exception\S3Exception $e) {
        exit('Error: ' . $e->getAwsErrorMessage() . PHP_EOL);
    }


    // Delete object
    try
    {
        echo 'Attempting to delete ' . $key . '...' . PHP_EOL;

        $result = $s3->deleteObject([
            'Bucket' => $bucket,
            'Key'    => $key
        ]);
    }
    catch (Aws\S3\Exception\S3Exception $e) {
        exit('Error: ' . $e->getAwsErrorMessage() . PHP_EOL);
    }

注意:

(1)以下是我程序中功能实现部分,项目中我只用到了文件上传与文件删除,各位工友使用的话要调整自己的配置哟~

(2)本地图片上传与抓取远程图片上传是不一样的哟~

(3)上传文件时要注意设置'ACL' => 'public-read';

<?php
// +----------------------------------------------------------------------
// | Author: xiaozhezhe
// +----------------------------------------------------------------------
use Aws\S3\S3Client;
use Aws\Exception\AwsException;
use GuzzleHttp\Client;

$bosConfig = config('basic.BOS_SET');
$s3 = new S3Client([
    'version' => 'latest',
    's3ForcePathStyle' => true,
    'region' => $bosConfig['region'],
    'endpoint' => $bosConfig['endpoint'],
    'credentials' => [
        'key' => $bosConfig['ak'],
        'secret' => $bosConfig['sk'],
    ],
]);

// 本地上传图片到bos
function uploadToBos($filename,$filepath)
{
    try
    {
        $s3result = $s3->putObject([
            'Bucket' => $bosConfig['bucket'],
            'Key'    => $filename,
            'Body'   => fopen($filepath,"r"),
            'ACL'    => 'public-read'
        ]);
    } catch (Aws\S3\Exception\S3Exception $e) {
        exit('Error: ' . $e->getAwsErrorMessage() . PHP_EOL);
    }
    $filePath = $s3result['ObjectURL'] ?? "";
    return $filePath;
}

// 远程抓取图片上传bos
function uploadOtherToBos($filename,$filepath)
{
    $http = new Client();
    $res = $http->request('GET',$filepath);
    try
    {
        $s3result = $s3->putObject([
            'Bucket' => $bosConfig['bucket'],
            'Key'    => $filename,
            'Body'   => $res->getBody(),
            'ContentLength' => $res->getHeader('content-length')[0],
            'ACL'    => 'public-read'
        ]);
    }  catch (Aws\S3\Exception\S3Exception $e) {
        exit('Error: ' . $e->getAwsErrorMessage() . PHP_EOL);
    }
    $filePath = $s3result['ObjectURL'] ?? "";
    return $filePath;
}

// 删除远程bos图片
function deleteBosFile($filename) 
{
    try
    {
        $result = $s3->deleteObject([
            'Bucket' => $bosConfig['bucket'],
            'Key'    => $filename
        ]);
        return true;
    }
    catch (Aws\S3\Exception\S3Exception $e) {
        exit('Error: ' . $e->getAwsErrorMessage() . PHP_EOL);
    }
}

常见问题

(1)上传不成功,一直转圈。

对接过程中,发现上传没什么反应,一直转圈圈,这个问题我查了很多文档,一直找不到原因,困扰了我一天,百思不得其解。

原因 :

       endpoint 地址配置问题;

解决方案:
          查看 endpoint 地址是否配置正确;切记切记,要检查所有的配置,保证配置正确!!!

(2)Curl 77/60 等问题

原因:

        证书问题

解决方案:

        (1)安装相关证书;

        (2) 我这边证书搞定之后还是crl问题,于是把 endpoint 地址从"https"更改为"http"就可以正常上传了;

(3)错误提示:payload content length is required and can not be calculated

原因:

        上传图片为链接,非本地图片

解决方案:

        (1)php 安装 guzzlehttp;
        (2)参考上述代码实现中的远程图片上传;

总结:

工作累了,要适当划水~~~

划水同时,要多喝热水~~~

要运动保持好身体~~~

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐