Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
1 | <?php |
||
23 | class Upyun { |
||
24 | |||
25 | /** |
||
26 | * @var Config: 服务配置 |
||
27 | */ |
||
28 | protected $config; |
||
29 | |||
30 | /** |
||
31 | * Upyun constructor. |
||
32 | * |
||
33 | * @param Config $config 服务配置 |
||
34 | */ |
||
35 | public function __construct(Config $config) { |
||
38 | |||
39 | /** |
||
40 | * 更新服务配置 |
||
41 | * |
||
42 | * 当需要操作的新的服务时,使用该方法传入新的服务配置即可 |
||
43 | * |
||
44 | * @param Config $config 服务配置 |
||
45 | * |
||
46 | * @return $this |
||
47 | */ |
||
48 | public function setConfig(Config $config) { |
||
52 | |||
53 | /** |
||
54 | * 上传一个文件到又拍云存储 |
||
55 | * |
||
56 | * 上传的文件格式支持文件流或者字符串方式上传。除简单的文件上传外,针对多媒体资源(图片、音视频),还可以设置同步/异步预处理多媒体资源,例如:图片的裁剪缩放,音视频的转码截图等等众多又拍云强大的云处理功能 |
||
57 | * |
||
58 | * @param string $path 被上传的文件在又拍云存储服务中保存的路径 |
||
59 | * @param string|resource $content 被上传的文件内容(字符串),或者打开该文件获得的文件句柄(文件流)。当上传本地大文件时,推荐使用文件流的方式上传 |
||
60 | * @param array $params 上传文件时,附加的自定义参数。支持 Content-MD5 Content-Type Content-Secret 等,详见 [上传参数](http://docs.upyun |
||
61 | * .com/api/rest_api/#_2),例如: |
||
62 | * - 设置文件[保护秘钥](http://docs.upyun.com/api/rest_api/#Content-Secret) `write($path, $content, array('Content-Secret' => 'my-secret'))`; |
||
63 | * - 添加[文件元信息](http://docs.upyun.com/api/rest_api/#metadata) `write($path, $content, array('X-Upyun-Meta-Foo' => |
||
64 | * 'bar'))` |
||
65 | * - [图片同步预处理](http://docs.upyun.com/cloud/image/#_5) `write($path, $content, array('x-gmkerl-thumb' => '/format/png'))` |
||
66 | * @param bool $withAsyncProcess 默认为 `false`,当上传图片或者音视频资源时,可以设置该参数为 `true`,开启图片音视频的[异步处理功能](http://docs.upyun.com/api/form_api/#_6) ,例如: |
||
67 | *``` |
||
68 | * // 以下参数会将新上传的图片,再异步生成另一份 png 格式的图片,原图不受影响 |
||
69 | * write($path, $content, array( |
||
70 | * 'apps' => array( |
||
71 | * array( |
||
72 | * 'name' => 'thumb', //异步图片处理任务 |
||
73 | * 'x-gmkerl-thumb' => '/format/png', // 格式化图片为 png 格式 |
||
74 | * 'save_as': '/iamge/png/new.png', // 处理成功后的图片保存路径 |
||
75 | * 'notify_url': 'http://your.notify.url' // 异步任务完成后的回调地址 |
||
76 | * ) |
||
77 | * ) |
||
78 | * ), true); |
||
79 | *``` |
||
80 | * |
||
81 | * |
||
82 | * |
||
83 | * @return array|bool 若文件是图片则返回图片基本信息,如:`array('x-upyun-width' => 123, 'x-upyun-height' => 50, 'x-upyun-frames' |
||
84 | * => 1, 'x-upyun-file-type' => 'JPEG')`,否则返回空数组。当使用异步预处理功能时,返回结果为布尔值,成功为 `true`。 |
||
85 | * |
||
86 | * @throws \Exception 上传失败时,抛出异常 |
||
87 | */ |
||
88 | public function write($path, $content, $params = array(), $withAsyncProcess = false) { |
||
100 | |||
101 | /** |
||
102 | * 读取云存储文件/目录内容 |
||
103 | * |
||
104 | * @param string $path 又拍云存储中的文件或者目录路径 |
||
105 | * @param resource $saveHandler 文件内容写入本地文件流。例如 `$saveHandler = fopen('/local/file', 'w') |
||
106 | * `。当设置该参数时,将以文件流的方式,直接将又拍云中的文件写入本地的文件流,或其他可以写入的流 |
||
107 | * @param array $params 可选参数,读取目录内容时,需要设置三个参数: `X-List-Iter` 分页开始位置(第一页不需要设置),`X-List-Limit` 获取的文件数量(默认 100,最大 |
||
108 | * 10000),`X-List-Order` 结果以时间正序或者倒序 |
||
109 | * |
||
110 | * @return mixed $return 当读取文件且没有设置 `$saveHandler` 参数时,返回一个字符串类型,表示文件内容;设置了 `$saveHandler` 参数时,返回布尔值 |
||
111 | * `true`。当读取目录时,返回一个数组,表示目录下的文件列表。目录下文件内容过多时,需要通过判断返回数组中的 `is_end` 属性,进行分页读取内容 |
||
112 | * |
||
113 | * @throws \Exception |
||
114 | */ |
||
115 | public function read($path, $saveHandler = NULL, $params = array()) { |
||
137 | |||
138 | /** |
||
139 | * 判断文件是否存在于又拍云存储 |
||
140 | * |
||
141 | * 注意: 对刚删除的文件, 立即调用该方法可能会返回 true, 因为服务端执行删除操作后可能会有很短暂的延迟. |
||
142 | * |
||
143 | * @param string $path 云存储的文件路径 |
||
144 | * |
||
145 | * @return bool 存在时返回 `true`,否则返回 `false` |
||
146 | * @throws \Exception |
||
147 | */ |
||
148 | public function has($path) { |
||
164 | |||
165 | /** |
||
166 | * 获取云存储文件/目录的基本信息 |
||
167 | * |
||
168 | * @param string $path 云存储的文件路径 |
||
169 | * |
||
170 | * @return array 返回一个数组,包含以下 key |
||
171 | * - `x-upyun-file-type` 当 $path 是目录时,值为 *folder*,当 $path 是文件时,值为 *file*, |
||
172 | * - `x-upyun-file-size` 文件大小 |
||
173 | * - `x-upyun-file-date` 文件的创建时间 |
||
174 | */ |
||
175 | public function info($path) { |
||
181 | |||
182 | /** |
||
183 | * 删除文件或者目录 |
||
184 | * |
||
185 | * @param string $path 文件或目录在又拍云存储的路径 |
||
186 | * @param bool $async 是否异步删除,默认为 false,表示同步删除。当需要批量删除大量文件时,必须选择异步删除 |
||
187 | * |
||
188 | * @return bool 删除成功返回 true,否则 false |
||
189 | * @throws \Exception 删除不存在的文件将会抛出异常 |
||
190 | */ |
||
191 | public function delete($path, $async = false) { |
||
200 | |||
201 | /** |
||
202 | * 创建目录 |
||
203 | * |
||
204 | * @param string $path 需要在又拍云存储创建的目录路径 |
||
205 | * |
||
206 | * @return bool 创建成功返回 true,否则返回 false |
||
207 | * @throws \Exception |
||
208 | */ |
||
209 | View Code Duplication | public function createDir($path) { |
|
217 | |||
218 | /** |
||
219 | * 删除文件或者目录 |
||
220 | * |
||
221 | * @param string $path 需要被删除的云存储文件或目录路径 |
||
222 | * |
||
223 | * @return bool 成功返回 true,否则 false |
||
224 | * @throws \Exception |
||
225 | */ |
||
226 | public function deleteDir($path) { |
||
229 | |||
230 | /** |
||
231 | * 获取目录下存储使用量 |
||
232 | * |
||
233 | * @param string $path 云存储目录路径,默认为根目录,表示整个云存储服务使用的空间大小 |
||
234 | * @return string 存储使用量,单位字节 |
||
235 | * @throws \Exception |
||
236 | */ |
||
237 | View Code Duplication | public function usage($path = '/') { |
|
247 | |||
248 | /** |
||
249 | * 刷新缓存 |
||
250 | * |
||
251 | * @param array|string $urls 需要刷新的文件 url 列表 |
||
252 | * |
||
253 | * @return array 刷新失败的 url 列表,若全部刷新成功则为空数组 |
||
254 | */ |
||
255 | public function purge($urls) { |
||
271 | |||
272 | /** |
||
273 | * 异步云处理 |
||
274 | * |
||
275 | * 该方法是基于[又拍云云处理](http://docs.upyun.com/cloud/) 服务实现,可以实现音视频的转码、切片、剪辑;文件的压缩解压缩;文件拉取功能 |
||
276 | * 所有需要调用该方法处理的资源,必须已经上传到云存储服务,未上传到云存储的文件,同时需要云处理功能,请使用 `write` 方法。 |
||
277 | * 例如视频转码: |
||
278 | * ``` |
||
279 | * process($source, array( |
||
280 | * array( |
||
281 | * 'type' => 'video', // video 表示视频任务, audio 表示音频任务 |
||
282 | * 'avopts' => '/s/240p(4:3)/as/1/r/30', // 处理参数,`s` 表示输出的分辨率,`r` 表示视频帧率,`as` 表示是否自动调整分辨率 |
||
283 | * 'save_as' => '/video/240/new.mp4', // 新视频在又拍云存储的保存路径 |
||
284 | * ), |
||
285 | * ... // 同时还可以添加其他任务 |
||
286 | * )) |
||
287 | * ``` |
||
288 | * 注意,被处理的资源需要已经上传到又拍云云存储 |
||
289 | * |
||
290 | * @param string $source 需要预处理的图片、音视频资源在又拍云存储的路径 |
||
291 | * @param array $tasks 需要处理的任务 |
||
292 | * |
||
293 | * @return array 任务 ID,提交了多少任务,便会返回多少任务 ID,与提交任务的顺序保持一致。可以通过任务 ID 查询处理进度。格式如下: |
||
294 | * ``` |
||
295 | * array( |
||
296 | * '35f0148d414a688a275bf915ba7cebb2', |
||
297 | * '98adbaa52b2f63d6d7f327a0ff223348', |
||
298 | * ) |
||
299 | * ``` |
||
300 | */ |
||
301 | public function process($source, $tasks) { |
||
305 | |||
306 | /** |
||
307 | * 音视频预处理任务进度查询 |
||
308 | * |
||
309 | * 根据 `process` 方法返回的任务 ID,通过该访问查询处理进度 |
||
310 | * |
||
311 | * @param array $taskIds 任务 ID |
||
312 | * |
||
313 | * @return bool|array 查询失败返回布尔值 `false`,否则返回每个任务的百分比进度信息,格式如下: |
||
314 | * ``` |
||
315 | * array( |
||
316 | * '35f0148d414a688a275bf915ba7cebb2' => 100, // 100 表示任务完成 |
||
317 | * 'c3103189fa906a5354d29bd807e8dc51' => 35, |
||
318 | * '98adbaa52b2f63d6d7f327a0ff223348' => null, // null 表示任务未开始,或异常 |
||
319 | * ) |
||
320 | * ``` |
||
321 | */ |
||
322 | public function queryProcessStatus($taskIds) { |
||
326 | |||
327 | /** |
||
328 | * 音视频预处理任务结果查询 |
||
329 | * |
||
330 | * 根据 `process` 方法返回的任务 ID,通过该访问查询处理结果,会包含每个任务详细信息 |
||
331 | * @param array $taskIds 任务 ID |
||
332 | * |
||
333 | * @return bool|mixed 查询失败返回 `false`,否则返回每个任务的处理结果,格式如下: |
||
334 | * ``` |
||
335 | * array( |
||
336 | * '9d9c32b63a1034834e77672c6f51f661' => array( |
||
337 | * 'path' => array('/v2.mp4'), |
||
338 | * 'signature' => '4042c1f07f546d28', |
||
339 | * 'status_code' => 200, |
||
340 | * 'bucket_name' => 'your_storage_bucket', |
||
341 | * 'description' => 'OK', |
||
342 | * 'task_id' => '9d9c32b63a1034834e77672c6f51f661', |
||
343 | * 'timestamp' => 1472010684 |
||
344 | * ) |
||
345 | * ) |
||
346 | * ``` |
||
347 | */ |
||
348 | public function queryProcessResult($taskIds) { |
||
352 | } |