php 使用 oss web直傳

lyxxxh發表於2021-05-12

前言

直傳優點: 無需經過伺服器,由前端直傳到 oss,因此可以減少伺服器頻寬使用 和 加快使用者上傳速度。

本篇講的這個不需要安裝擴充套件包,僅有直傳功能,是非常輕量的。

我是參考https://github.com/iiDestiny/flysystem-oss來寫的,如果你需要在 php 使用其他的 oss 功能,那麼擴充套件包更合適。

建立OssUploadSignature.php

<?php

namespace Service;
class OssUploadSignature
{

    private $accessKeyId;
    private $accessKeySecret;
    private $expire = 300; // 5分鐘有效期
    private $bucketHost; // Bucket 域名
    private $conditions = [ // 限制
        [
            'content-length-range', // 內容限制
            0,                  // 最小上傳
            10 * 1024 * 1024 // 最大上傳10m
        ], [
            0 => 'starts-with',
            1 => '$key', // 必須帶key
            2 => 'images/', // 如:/images  只能放在/images的路徑
        ]
    ];

    public function setBucketHost($bucketHost)
    {
        $this->bucketHost = $bucketHost;
        return $this;
    }

    public function setAccessKeyId($accessKeyId)
    {
        $this->accessKeyId = $accessKeyId;
        return $this;
    }

    public function setAccessKeySecret($accessKeySecret)
    {
        $this->accessKeySecret = $accessKeySecret;
        return $this;
    }

    public function signatureConfig()
    {
        $end = time() + $this->expire;
        $arr = [
            'expiration' => $this->gmt_iso8601($end),
            'conditions' => $this->conditions,
        ];
        $base64Policy = base64_encode(
            json_encode($arr)
        );
        $signature = base64_encode(hash_hmac('sha1', $base64Policy, $this->accessKeySecret, true));
        return [
            'OSSAccessKeyId' => $this->accessKeyId,
            'policy' => $base64Policy,
            'signature' => $signature,
            'expire' => $end,
            'bucketHost' => $this->bucketHost
        ];
    }


    // fix bug https://connect.console.aliyun.com/connect/detail/162632
    public function gmt_iso8601($time)
    {
        return (new \DateTime(null, new \DateTimeZone('UTC')))->setTimestamp($time)->format('Y-m-d\TH:i:s\Z');
    }

}

執行

php 使用 oss web直傳

php 使用 oss web直傳

Postman測試

php 使用 oss web直傳

php 使用 oss web直傳

小心bug

bucketHost 可以在 oss 檢視。

php 使用 oss web直傳

複製 policy 的時候 注意是否有換行符(我都沒注意…)

本作品採用《CC 協議》,轉載必須註明作者和本文連結
專心學習不瞎搞

相關文章