15295036569
2023-06-12 6bc6f63c8c7ef55c2d9d78ccc8917c87f8cd9101
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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;
    }
}