国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

OSS 直傳阿里騰訊示例

caylof

今天 Q 群有朋友說(shuō)不會(huì) OSS 直傳,那我就來(lái)寫個(gè)例子吧。歡迎兄弟們探討交流。

0. 引入 aws 的 sdk

composer require aws/aws-sdk-php

1. 上傳到阿里云OSS

1.1 創(chuàng)建S3客戶端

$s3client = new \Aws\S3\S3Client([
    'credentials' => [
        'key'    => 'KEY',
        'secret' => 'SK',
    ],
    'region' => 'oss-cn-chengdu',
    'version' => '2006-03-01',
    'endpoint' => 'https://caylof.oss-cn-chengdu.aliyuncs.com',
    'use_path_style_endpoint' => true,
//    'endpoint' => 'https://oss-cn-chengdu.aliyuncs.com',
//    'addressing_style' => 'virtual',
]);

1.2 服務(wù)器上傳文件

通常前端先上傳到服務(wù)器,然后通過(guò)服務(wù)器再上傳到OSS,即中傳了一次。

function put(\Aws\S3\S3Client $s3client): void
{
    $bucket = 'a';
    $key = '123.txt';

    $s3client->putObject([
        'Bucket' => $bucket,
        'Key' => $key,
        'Body' => file_get_contents(__DIR__.'/1.php'),
        'ContentType' => 'text/plain',
    ]);
}

1.3 前端直傳文件到OSS

1.3.1 服務(wù)器先生成簽名表單

function buildForm(\Aws\S3\S3Client $s3client): array
{
    $bucket = 'a/123.txt'; // 這里阿云的兼容似乎有點(diǎn)別扭,用真正的bucket會(huì)有問(wèn)題
    $key = 'a/123.txt';

    $maxUploadSize = 1024 * 1024 * 10;
    $contentType = 'text/plain';

    $formInputs = ['acl' => 'private'];
    $options = [
        ['acl' => 'private'],
        ['bucket' => $bucket],
        ['key' => $key],
        ['Content-Type' => $contentType],
        ['content-length-range', 1, $maxUploadSize],
    ];
    $expires = '+10 minutes';
    $postObject = new \Aws\S3\PostObjectV4(
        $s3client,
        $bucket,
        $formInputs,
        $options,
        $expires
    );

    $formAttributes = $postObject->getFormAttributes();
    $formInputs = $postObject->getFormInputs();
    $formInputs['key'] = $key;
    $formInputs['Content-Type'] = $contentType;

//    print_r($formAttributes);
//    print_r($formInputs);

    return [$formAttributes, $formInputs];
}

返回的 $formAttributes$formAttributes 就是前端需要的表單屬性和表單輸入,然后用于前端進(jìn)行構(gòu)造表單并提交即可。

1.3.2 前端直接上傳文件

我這里不采用JS(通常會(huì)是axios)來(lái)構(gòu)造表單,而是用 PHP 的 guzzle client 來(lái)模擬前端實(shí)現(xiàn)。

function uploadMock(array $formAttributes, array $formInputs): void
{
    $multipart = [];
    foreach ($formInputs as $name => $value) {
        $multipart[] = [
            'name' => $name,
            'contents' => $value,
        ];
    }
    $multipart[] = [
        'name' => 'file',
        'contents' => file_get_contents(__DIR__.'/1.php'),
    ];

    $http = new \GuzzleHttp\Client();
    $resp = $http->put($formAttributes['action'], [
        'multipart' => $multipart,
        'headers' => [
            'Accept' => 'application/json',
        ],
    ]);
    echo $resp->getStatusCode() . PHP_EOL;
    print_r($resp->getBody()->getContents());
}

2. 上傳到騰訊云COS

2.1 創(chuàng)建S3客戶端

$s3client = new \Aws\S3\S3Client([
    'credentials' => [
        'key'    => 'KEY',
        'secret' => 'SK',
    ],
    'region' => 'auto',
    'version' => 'latest',
    'endpoint' => 'https://xxx-yyy.cos.ap-chengdu.myqcloud.com',
    'use_path_style_endpoint' => true,
]);

服務(wù)器上傳文件同上阿里云。

2.2 前端直接上傳文件

2.2.1 服務(wù)器先生成簽名表單

function buildForm(\Aws\S3\S3Client $s3client): array
{
    $bucket = 'xxx-yyy'; // 這里騰訊云看起來(lái)比阿里云做的合理
    $key = 'a/123.txt';

    $maxUploadSize = 1024 * 1024 * 10;
    $contentType = 'text/plain';

    $formInputs = ['acl' => 'private'];
    $options = [
        ['acl' => 'private'],
        ['bucket' => $bucket],
        ['key' => $key],
        ['Content-Type' => $contentType],
        ['content-length-range', 1, $maxUploadSize],
    ];
    $expires = '+10 minutes';
    $postObject = new \Aws\S3\PostObjectV4(
        $s3client,
        $bucket,
        $formInputs,
        $options,
        $expires
    );

    $formAttributes = $postObject->getFormAttributes();
    $formInputs = $postObject->getFormInputs();
    $formInputs['key'] = $key;
    $formInputs['Content-Type'] = $contentType;

//    print_r($formAttributes);
//    print_r($formInputs);

    return [$formAttributes, $formInputs];
}

2.2.2 前端直接上傳文件

function uploadMock(array $formAttributes, array $formInputs): void
{
    $multipart = [];
    foreach ($formInputs as $name => $value) {
        $multipart[] = [
            'name' => str_replace('X-Amz', 'X-Cos', $name), // 騰訊云對(duì)名稱做了替換處理,一個(gè)小細(xì)節(jié)
            'contents' => $value,
        ];
    }
    $multipart[] = [
        'name' => 'file',
        'contents' => file_get_contents(__DIR__.'/1.php'),
    ];

    $http = new \GuzzleHttp\Client();
    $resp = $http->put($formAttributes['action'], [
        'multipart' => $multipart,
        'headers' => [
            'Accept' => 'application/json',
        ],
    ]);
    echo $resp->getStatusCode() . PHP_EOL;
    print_r($resp->getBody()->getContents());
}

~ over ~

1340 1 1
1個(gè)評(píng)論

timeless-zyg

aws不是亞馬遜的包嗎?

  • 暫無(wú)評(píng)論

caylof

340
積分
0
獲贊數(shù)
0
粉絲數(shù)
2022-08-13 加入
??