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 | } |