前言
直傳優點: 無需經過伺服器,由前端直傳到 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');
}
}
執行
Postman測試
小心bug
bucketHost
可以在 oss
檢視。
複製 policy
的時候 注意是否有換行符(我都沒注意…)
本作品採用《CC 協議》,轉載必須註明作者和本文連結