feat(upload): 添加华为 OBS 对象存储支持
- 在 addons.php 中添加了与华为 OBS 相关的钩子 - 新增了对华为 OBS 上传功能的实现,包括分片上传和合并 - 优化了上传参数处理和错误处理 - 支持客户端和服务端两种上传模式
This commit is contained in:
68
addons/hwobs/library/Signer.php
Normal file
68
addons/hwobs/library/Signer.php
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
namespace addons\hwobs\library;
|
||||
|
||||
use Obs\Internal\Common\Model;
|
||||
use Obs\Internal\Signature\DefaultSignature;
|
||||
|
||||
class Signer
|
||||
{
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取分片文件的签名
|
||||
* @param string $url
|
||||
* @param string $uploadId
|
||||
* @param int $fileSize
|
||||
* @param int $partSize
|
||||
* @param string $date
|
||||
* @return array
|
||||
*/
|
||||
public static function getPartsAuthorization($url, $uploadId, $fileSize, $partSize, $date)
|
||||
{
|
||||
$config = get_addon_config('hwobs');
|
||||
$i = 0;
|
||||
$size_count = $fileSize;
|
||||
$values = array();
|
||||
while ($size_count > 0) {
|
||||
$size_count -= $partSize;
|
||||
$values[] = array(
|
||||
$partSize * $i,
|
||||
($size_count > 0) ? $partSize : ($size_count + $partSize),
|
||||
);
|
||||
$i++;
|
||||
}
|
||||
|
||||
$httpMethod = "PUT";
|
||||
$headers = [
|
||||
"Host" => str_replace(['http://', 'https://'], '', $config['uploadurl']),
|
||||
"Content-Length" => 0,
|
||||
"x-amz-date" => $date,
|
||||
];
|
||||
|
||||
$result = [];
|
||||
foreach ($values as $index => $value) {
|
||||
$headers['Content-Length'] = $value[1];
|
||||
$params = ['partNumber' => $index + 1, 'uploadId' => $uploadId, 'uriParam' => $url, 'dnsParam' => $config['bucket'], 'x-amz-date' => $date];
|
||||
$model = new Model($params);
|
||||
$sign = new DefaultSignature($config['accessKey'], $config['secretKey'], false, $config['uploadurl'], $httpMethod, 'v2', false, false);
|
||||
$requestConfig = [
|
||||
'httpMethod' => $httpMethod,
|
||||
'requestParameters' => [
|
||||
'x-amz-date' => ['location' => 'header'],
|
||||
'partNumber' => ['location' => 'query'],
|
||||
'uploadId' => ['location' => 'query'],
|
||||
'uriParam' => ['location' => 'uri'],
|
||||
'dnsParam' => ['location' => 'dns'],
|
||||
]
|
||||
];
|
||||
$sig = $sign->doAuth($requestConfig, $params, $model);
|
||||
$result[] = $sig['headers']['Authorization'];
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user