zhaojs
2023-06-29 c6aed7b39a4e95a25e5bcac47a55ac98cb222b49
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<?php
 
namespace addons\hwobs;
 
use addons\hwobs\library\Auth;
use Obs\ObsClient;
use think\Addons;
use think\App;
use think\Loader;
 
/**
 * 华为云存储插件
 */
class Hwobs extends Addons
{
 
    /**
     * 插件安装方法
     * @return bool
     */
    public function install()
    {
 
        return true;
    }
 
    /**
     * 插件卸载方法
     * @return bool
     */
    public function uninstall()
    {
 
        return true;
    }
 
    /**
     * 插件启用方法
     * @return bool
     */
    public function enable()
    {
 
        return true;
    }
 
    /**
     * 插件禁用方法
     * @return bool
     */
    public function disable()
    {
 
        return true;
    }
 
    /**
     * 判断是否来源于API上传
     */
    public function moduleInit($request)
    {
        $config = $this->getConfig();
        $module = strtolower($request->module());
        if ($module == 'api' && ($config['apiupload'] ?? 0) &&
            strtolower($request->controller()) == 'common' &&
            strtolower($request->action()) == 'upload') {
            request()->param('isApi', true);
            App::invokeMethod(["\\addons\\hwobs\\controller\\Index", "upload"], ['isApi' => true]);
        }
    }
 
    /**
     * 上传配置初始化
     */
    public function uploadConfigInit(&$upload)
    {
        $config = $this->getConfig();
        $module = request()->module();
        $module = $module ? strtolower($module) : 'index';
 
        $data = ['deadline' => time() + $config['expire']];
        $signature = hash_hmac('sha1', json_encode($data), $config['secretKey'], true);
 
        $token = '';
        if (Auth::isModuleAllow()) {
            $token = $config['accessKey'] . ':' . base64_encode($signature) . ':' . base64_encode(json_encode($data));
        }
        $multipart = [
            'hwobstoken' => $token
        ];
 
        $upload = array_merge($upload, [
            'cdnurl'     => $config['cdnurl'],
            'uploadurl'  => $config['uploadmode'] == 'client' ? $config['uploadurl'] : addon_url('hwobs/index/upload', [], false, true),
            'uploadmode' => $config['uploadmode'],
            'bucket'     => $config['bucket'],
            'maxsize'    => $config['maxsize'],
            'mimetype'   => $config['mimetype'],
            'savekey'    => $config['savekey'],
            'chunking'   => (bool)($config['chunking'] ?? $upload['chunking']),
            'chunksize'  => (int)($config['chunksize'] ?? $upload['chunksize']),
            'multipart'  => $multipart,
            'storage'    => $this->getName(),
            'multiple'   => (bool)$config['multiple'],
        ]);
    }
 
    /**
     * 附件删除后
     */
    public function uploadDelete($attachment)
    {
        $config = $this->getConfig();
        if ($attachment['storage'] == 'hwobs' && isset($config['syncdelete']) && $config['syncdelete']) {
            try {
                //删除云储存文件
                $config = get_addon_config('hwobs');
                $obs = new ObsClient([
                    'key'      => $config['accessKey'],
                    'secret'   => $config['secretKey'],
                    'endpoint' => $config['endpoint']
                ]);
                $result = $obs->deleteObject([
                    'Bucket' => $config['bucket'],
                    'Key'    => ltrim($attachment->url, '/')
                ]);
            } catch (\Exception $e) {
                return false;
            }
 
            //如果是服务端中转,还需要删除本地文件
            //if ($config['uploadmode'] == 'server') {
            //    $filePath = ROOT_PATH . 'public' . str_replace('/', DS, $attachment->url);
            //    if ($filePath) {
            //        @unlink($filePath);
            //    }
            //}
 
        }
        return true;
    }
 
    /**
     * 渲染命名空间配置信息
     */
    public function appInit()
    {
        if (!class_exists('\Obs\ObsClient')) {
            Loader::addNamespace('Obs', $this->addons_path . str_replace('/', DS, 'library/Obs/'));
        }
    }
}