BucketManager.php 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107
  1. <?php
  2. namespace Qiniu\Storage;
  3. use Qiniu\Auth;
  4. use Qiniu\Config;
  5. use Qiniu\Zone;
  6. use Qiniu\Http\Client;
  7. use Qiniu\Http\Error;
  8. /**
  9. * 主要涉及了空间资源管理及批量操作接口的实现,具体的接口规格可以参考
  10. *
  11. * @link https://developer.qiniu.com/kodo/api/1274/rs
  12. */
  13. final class BucketManager
  14. {
  15. private $auth;
  16. private $config;
  17. public function __construct(Auth $auth, Config $config = null)
  18. {
  19. $this->auth = $auth;
  20. if ($config == null) {
  21. $this->config = new Config();
  22. } else {
  23. $this->config = $config;
  24. }
  25. }
  26. /**
  27. * 获取指定账号下所有的空间名。
  28. *
  29. * @return string[] 包含所有空间名
  30. */
  31. public function buckets($shared = true)
  32. {
  33. $includeShared = "false";
  34. if ($shared === true) {
  35. $includeShared = "true";
  36. }
  37. return $this->rsGet('/buckets?shared=' . $includeShared);
  38. }
  39. /**
  40. * 列举空间,返回bucket列表
  41. * region 指定区域,global 指定全局空间。
  42. * 在指定了 region 参数时,
  43. * 如果指定 global 为 true,那么忽略 region 参数指定的区域,返回所有区域的全局空间。
  44. * 如果没有指定 global 为 true,那么返回指定区域中非全局空间。
  45. * 在没有指定 region 参数时(包括指定为空""),
  46. * 如果指定 global 为 true,那么返回所有区域的全局空间。
  47. * 如果没有指定 global 为 true,那么返回指定区域中所有的空间,包括全局空间。
  48. * 在指定了line为 true 时,只返回 Line 空间;否则,只返回非 Line 空间。
  49. * share 参数用于指定共享空间。
  50. */
  51. public function listbuckets(
  52. $region = null,
  53. $line = 'false',
  54. $shared = 'false'
  55. ) {
  56. $path = '/v3/buckets?region=' . $region . '&line=' . $line . '&shared=' . $shared;
  57. $info = $this->ucPost($path);
  58. return $info;
  59. }
  60. /**
  61. * 创建空间
  62. *
  63. * @param $name 创建的空间名
  64. * @param $region 创建的区域,默认华东
  65. *
  66. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  67. */
  68. public function createBucket($name, $region = 'z0')
  69. {
  70. $path = '/mkbucketv2/'.$name.'/region/' . $region;
  71. return $this->rsPost($path, null);
  72. }
  73. /**
  74. * 删除空间
  75. *
  76. * @param $name 删除的空间名
  77. *
  78. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  79. */
  80. public function deleteBucket($name)
  81. {
  82. $path = '/drop/'.$name;
  83. return $this->rsPost($path, null);
  84. }
  85. /**
  86. * 获取指定空间绑定的所有的域名
  87. *
  88. * @return string[] 包含所有空间域名
  89. */
  90. public function domains($bucket)
  91. {
  92. return $this->apiGet('/v6/domain/list?tbl=' . $bucket);
  93. }
  94. /**
  95. * 获取指定空间的相关信息
  96. *
  97. * @return string[] 包含空间信息
  98. */
  99. public function bucketInfo($bucket)
  100. {
  101. $path = '/v2/bucketInfo?bucket=' . $bucket;
  102. $info = $this->ucPost($path);
  103. return $info;
  104. }
  105. /**
  106. * 获取指定zone的空间信息列表
  107. * 在Region 未指定且Global 不为 true 时(包含未指定的情况,下同),返回用户的所有空间。
  108. * 在指定了 region 参数且 global 不为 true 时,只列举非全局空间。
  109. * shared 不指定shared参数或指定shared为rw或false时,返回包含具有读写权限空间,
  110. * 指定shared为rd或true时,返回包含具有读权限空间。
  111. * fs:如果为 true,会返回每个空间当前的文件数和存储量(实时数据)。
  112. * @return string[] 包含空间信息
  113. */
  114. public function bucketInfos($region = null, $shared = 'false', $fs = 'false')
  115. {
  116. $path = '/v2/bucketInfos?region=' . $region . '&shared=' . $shared . '&fs=' . $fs;
  117. $info = $this->ucPost($path);
  118. return $info;
  119. }
  120. /**
  121. * 获取空间绑定的域名列表
  122. * @return string[] 包含空间绑定的所有域名
  123. */
  124. /**
  125. * 列取空间的文件列表
  126. *
  127. * @param $bucket 空间名
  128. * @param $prefix 列举前缀
  129. * @param $marker 列举标识符
  130. * @param $limit 单次列举个数限制
  131. * @param $delimiter 指定目录分隔符
  132. *
  133. * @return array 包含文件信息的数组,类似:[
  134. * {
  135. * "hash" => "<Hash string>",
  136. * "key" => "<Key string>",
  137. * "fsize" => "<file size>",
  138. * "putTime" => "<file modify time>"
  139. * },
  140. * ...
  141. * ]
  142. * @link http://developer.qiniu.com/docs/v6/api/reference/rs/list.html
  143. */
  144. public function listFiles(
  145. $bucket,
  146. $prefix = null,
  147. $marker = null,
  148. $limit = 1000,
  149. $delimiter = null
  150. ) {
  151. $query = array('bucket' => $bucket);
  152. \Qiniu\setWithoutEmpty($query, 'prefix', $prefix);
  153. \Qiniu\setWithoutEmpty($query, 'marker', $marker);
  154. \Qiniu\setWithoutEmpty($query, 'limit', $limit);
  155. \Qiniu\setWithoutEmpty($query, 'delimiter', $delimiter);
  156. $url = $this->getRsfHost() . '/list?' . http_build_query($query);
  157. return $this->get($url);
  158. }
  159. /**
  160. * 列取空间的文件列表
  161. *
  162. * @param $bucket 空间名
  163. * @param $prefix 列举前缀
  164. * @param $marker 列举标识符
  165. * @param $limit 单次列举个数限制
  166. * @param $delimiter 指定目录分隔符
  167. * @param $skipconfirm 是否跳过已删除条目的确认机制
  168. *
  169. * @return array 包含文件信息的数组,类似:[
  170. * {
  171. * "hash" => "<Hash string>",
  172. * "key" => "<Key string>",
  173. * "fsize" => "<file size>",
  174. * "putTime" => "<file modify time>"
  175. * },
  176. * ...
  177. * ]
  178. * @link http://developer.qiniu.com/docs/v6/api/reference/rs/list.html
  179. */
  180. public function listFilesv2(
  181. $bucket,
  182. $prefix = null,
  183. $marker = null,
  184. $limit = 1000,
  185. $delimiter = null,
  186. $skipconfirm = true
  187. ) {
  188. $query = array('bucket' => $bucket);
  189. \Qiniu\setWithoutEmpty($query, 'prefix', $prefix);
  190. \Qiniu\setWithoutEmpty($query, 'marker', $marker);
  191. \Qiniu\setWithoutEmpty($query, 'limit', $limit);
  192. \Qiniu\setWithoutEmpty($query, 'delimiter', $delimiter);
  193. \Qiniu\setWithoutEmpty($query, 'skipconfirm', $skipconfirm);
  194. $path = '/v2/list?' . http_build_query($query);
  195. $url = $this->getRsfHost() . $path;
  196. $headers = $this->auth->authorization($url, null, 'application/x-www-form-urlencoded');
  197. $ret = Client::post($url, null, $headers);
  198. if (!$ret->ok()) {
  199. return array(null, new Error($url, $ret));
  200. }
  201. $r = explode("\n", $ret->body);
  202. $pop = array_pop($r);
  203. return array($r, null);
  204. }
  205. /**
  206. * 设置Referer防盗链
  207. *
  208. * @param $bucket 空间名
  209. * @param $mode 0: 表示关闭Referer(使用此选项将会忽略以下参数并将恢复默认值);
  210. * 1: 表示设置Referer白名单; 2:表示设置Referer黑名单
  211. * @param $norefer 0: 表示不允许空 Refer 访问; 1: 表示允许空 Refer 访问
  212. * @param $pattern 规则字符串, 当前允许格式分为三种: 一种为空主机头域名,
  213. * 比如 foo.com; 一种是泛域名,比如 *.bar.com; 一种是完全通配符,
  214. * 即一个 *; 多个规则之间用;隔开, 比如: foo.com;*.bar.com;sub.foo.com;*.sub.bar.com
  215. * @param $source_enabled 源站是否支持,默认为0只给CDN配置, 设置为1表示开启源站防盗链
  216. *
  217. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  218. */
  219. // public function referAntiLeech(){
  220. // }
  221. /**
  222. * 增加bucket生命规则
  223. *
  224. * @param $bucket 空间名
  225. * @param $name 规则名称 bucket 内唯一,长度小于50,不能为空,只能为
  226. * 字母、数字、下划线
  227. * @param $prefix 同一个 bucket 里面前缀不能重复
  228. * @param $delete_after_days 指定上传文件多少天后删除,指定为0表示不删除,
  229. * 大于0表示多少天后删除,需大于 to_line_after_days
  230. * @param $to_line_after_days 指定文件上传多少天后转低频存储。指定为0表示
  231. * 不转低频存储,小于0表示上传的文件立即变低频存储
  232. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  233. */
  234. public function bucketLifecycleRule(
  235. $bucket,
  236. $name,
  237. $prefix,
  238. $delete_after_days,
  239. $to_line_after_days
  240. ) {
  241. $path = '/rules/add';
  242. if ($bucket) {
  243. $params['bucket'] = $bucket;
  244. }
  245. if ($name) {
  246. $params['name'] = $name;
  247. }
  248. if ($prefix) {
  249. $params['prefix'] = $prefix;
  250. }
  251. if ($delete_after_days) {
  252. $params['delete_after_days'] = $delete_after_days;
  253. }
  254. if ($to_line_after_days) {
  255. $params['to_line_after_days'] = $to_line_after_days;
  256. }
  257. $data = http_build_query($params);
  258. $info = $this->ucPost($path, $data);
  259. return $info;
  260. }
  261. /**
  262. * 更新bucket生命规则
  263. *
  264. * @param $bucket 空间名
  265. * @param $name 规则名称 bucket 内唯一,长度小于50,不能为空,只能为字母、
  266. * 数字、下划线
  267. * @param $prefix 同一个 bucket 里面前缀不能重复
  268. * @param $delete_after_days 指定上传文件多少天后删除,指定为0表示不删除,
  269. * 大于0表示多少天后删除,需大于 to_line_after_days
  270. * @param $to_line_after_days 指定文件上传多少天后转低频存储。指定为0表示不
  271. * 转低频存储,小于0表示上传的文件立即变低频存储
  272. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  273. */
  274. public function updateBucketLifecycleRule(
  275. $bucket,
  276. $name,
  277. $prefix,
  278. $delete_after_days,
  279. $to_line_after_days
  280. ) {
  281. $path = '/rules/update';
  282. if ($bucket) {
  283. $params['bucket'] = $bucket;
  284. }
  285. if ($name) {
  286. $params['name'] = $name;
  287. }
  288. if ($prefix) {
  289. $params['prefix'] = $prefix;
  290. }
  291. if ($delete_after_days) {
  292. $params['delete_after_days'] = $delete_after_days;
  293. }
  294. if ($to_line_after_days) {
  295. $params['to_line_after_days'] = $to_line_after_days;
  296. }
  297. $data = http_build_query($params);
  298. $info = $this->ucPost($path, $data);
  299. return $info;
  300. }
  301. /**
  302. * 获取bucket生命规则
  303. *
  304. * @param $bucket 空间名
  305. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  306. */
  307. public function getBucketLifecycleRules($bucket)
  308. {
  309. $path = '/rules/get?bucket=' . $bucket;
  310. $info = $this->ucGet($path);
  311. return $info;
  312. }
  313. /**
  314. * 删除bucket生命规则
  315. *
  316. * @param $bucket 空间名
  317. * @param $name 规则名称 bucket 内唯一,长度小于50,不能为空,
  318. * 只能为字母、数字、下划线()
  319. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  320. */
  321. public function deleteBucketLifecycleRule($bucket, $name)
  322. {
  323. $path = '/rules/delete';
  324. if ($bucket) {
  325. $params['bucket'] = $bucket;
  326. }
  327. if ($name) {
  328. $params['name'] = $name;
  329. }
  330. $data = http_build_query($params);
  331. $info = $this->ucPost($path, $data);
  332. return $info;
  333. }
  334. /**
  335. * 增加bucket事件通知规则
  336. *
  337. * @param $bucket 空间名
  338. * @param $name 规则名称 bucket 内唯一,长度小于50,不能为空,
  339. * 只能为字母、数字、下划线()
  340. * @param $prefix 同一个 bucket 里面前缀不能重复
  341. * @param $suffix 可选,文件配置的后缀
  342. * @param $event 事件类型,可以指定多个,包括 put,mkfile,delete,copy,move,append,
  343. * disable,enable,deleteMarkerCreate
  344. * @param $callbackURL 通知URL,可以指定多个,失败依次重试
  345. * @param $access_key 可选,设置的话会对通知请求用对应的ak、sk进行签名
  346. * @param $host 可选,通知请求的host
  347. *
  348. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  349. */
  350. public function putBucketEvent(
  351. $bucket,
  352. $name,
  353. $prefix,
  354. $suffix,
  355. $event,
  356. $callbackURL,
  357. $access_key = null,
  358. $host = null
  359. ) {
  360. $path = '/events/add';
  361. if ($bucket) {
  362. $params['bucket'] = $bucket;
  363. }
  364. if ($name) {
  365. $params['name'] = $name;
  366. }
  367. if ($prefix) {
  368. $params['prefix'] = $prefix;
  369. }
  370. if ($suffix) {
  371. $params['suffix'] = $suffix;
  372. }
  373. if ($callbackURL) {
  374. $params['callbackURL'] = $callbackURL;
  375. }
  376. if ($access_key) {
  377. $params['access_key'] = $access_key;
  378. }
  379. if ($host) {
  380. $params['host'] = $host;
  381. }
  382. $data = http_build_query($params);
  383. if ($event) {
  384. $eventpath = "";
  385. foreach ($event as $key => $value) {
  386. $eventpath .= "&event=$value";
  387. }
  388. $data .= $eventpath;
  389. }
  390. $info = $this->ucPost($path, $data);
  391. return $info;
  392. }
  393. /**
  394. * 更新bucket事件通知规则
  395. *
  396. * @param $bucket 空间名
  397. * @param $name 规则名称 bucket 内唯一,长度小于50,不能为空,
  398. * 只能为字母、数字、下划线()
  399. * @param $prefix 同一个 bucket 里面前缀不能重复
  400. * @param $suffix 可选,文件配置的后缀
  401. * @param $event 事件类型,可以指定多个,包括 put,mkfile,delete,copy,move,append,disable,
  402. * enable,deleteMarkerCreate
  403. * @param $callbackURL 通知URL,可以指定多个,失败依次重试
  404. * @param $access_key 可选,设置的话会对通知请求用对应的ak、sk进行签名
  405. * @param $host 可选,通知请求的host
  406. *
  407. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  408. */
  409. public function updateBucketEvent(
  410. $bucket,
  411. $name,
  412. $prefix,
  413. $suffix,
  414. $event,
  415. $callbackURL,
  416. $access_key = null,
  417. $host = null
  418. ) {
  419. $path = '/events/update';
  420. if ($bucket) {
  421. $params['bucket'] = $bucket;
  422. }
  423. if ($name) {
  424. $params['name'] = $name;
  425. }
  426. if ($prefix) {
  427. $params['prefix'] = $prefix;
  428. }
  429. if ($suffix) {
  430. $params['suffix'] = $suffix;
  431. }
  432. if ($event) {
  433. $params['event'] = $event;
  434. }
  435. if ($callbackURL) {
  436. $params['callbackURL'] = $callbackURL;
  437. }
  438. if ($access_key) {
  439. $params['access_key'] = $access_key;
  440. }
  441. if ($host) {
  442. $params['host'] = $host;
  443. }
  444. $data = http_build_query($params);
  445. $info = $this->ucPost($path, $data);
  446. return $info;
  447. }
  448. /**
  449. * 获取bucket事件通知规则
  450. *
  451. * @param $bucket 空间名
  452. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  453. */
  454. public function getBucketEvents($bucket)
  455. {
  456. $path = '/events/get?bucket=' . $bucket;
  457. $info = $this->ucGet($path);
  458. return $info;
  459. }
  460. /**
  461. * 删除bucket事件通知规则
  462. *
  463. * @param $bucket 空间名
  464. * @param $name 规则名称 bucket 内唯一,长度小于50,不能为空,
  465. * 只能为字母、数字、下划线
  466. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  467. */
  468. public function deleteBucketEvent($bucket, $name)
  469. {
  470. $path = '/events/delete';
  471. if ($bucket) {
  472. $params['bucket'] = $bucket;
  473. }
  474. if ($name) {
  475. $params['name'] = $name;
  476. }
  477. $data = http_build_query($params);
  478. $info = $this->ucPost($path, $data);
  479. return $info;
  480. }
  481. /**
  482. * 设置bucket的跨域信息,最多允许设置10条跨域规则。
  483. * 对于同一个域名如果设置了多条规则,那么按顺序使用第一条匹配的规则去生成返回值。
  484. * 对于简单跨域请求,只匹配 Origin;
  485. * allowed_orgin: 允许的域名。必填;支持通配符*;*表示全部匹配;只有第一个*生效;
  486. * 需要设置"Scheme";大小写敏感。例如
  487. * 规则:http://*.abc.*.com 请求:"http://test.abc.test.com" 结果:不通过
  488. * 规则:"http://abc.com" 请求:"https://abc.com"/"abc.com" 结果:不通过
  489. * 规则:"abc.com" 请求:"http://abc.com" 结果:不通过
  490. * allowed_method: 允许的方法。必填;不支持通配符;大小写不敏感;
  491. * allowed_header: 允许的header。选填;支持通配符*,
  492. * 但只能是单独的*,表示允许全部header,其他*不生效;
  493. * 空则不允许任何header;大小写不敏感;
  494. * exposed_header: 暴露的header。选填;不支持通配符;
  495. * X-Log, X-Reqid是默认会暴露的两个header;
  496. * 其他的header如果没有设置,则不会暴露;大小写不敏感;
  497. * max_age: 结果可以缓存的时间。选填;空则不缓存;
  498. * allowed_credentials:该配置不支持设置,默认为true。
  499. * 备注:如果没有设置任何corsRules,那么默认允许所有的跨域请求
  500. */
  501. // public function putCorsRules(string $bucket, array $params)
  502. // {
  503. // $path = '/corsRules/set/' . $bucket;
  504. // $data = json_encode($params);
  505. // $info = $this->ucPost($path, $data);
  506. // return $info;
  507. // }
  508. /**
  509. * 获取bucket的跨域信息
  510. * $bucket 空间名
  511. */
  512. public function getCorsRules($bucket)
  513. {
  514. $path = '/corsRules/get/' . $bucket;
  515. $info = $this->ucGet($path);
  516. return $info;
  517. }
  518. /**
  519. * 设置回源规则
  520. * 使用该API设置源站优先级高于/image设置的源站,即IO优先读取source接口设置的源站配置,
  521. * 如果存在会忽略/image设置的源站
  522. * Bucket 空间名
  523. * Host(可选)回源Host
  524. * RetryCodes(可选),镜像回源时源站返回Code可以重试,最多指定3个,当前只支持4xx错误码重试
  525. * SourceQiniuAK,SourceQiniuSK(可选)如果存在将在回源时对URL进行签名,客户源站可以验证
  526. * 以保证请求来自Qiniu服务器
  527. * Expires(可选) 签名过期时间,如果不设置默认为1小时
  528. * Addr 回源地址,不可重复。
  529. * Weight 权重,范围限制1-100,不填默认为1,回源时会根据所有源的权重值进行源站选择,
  530. * 主备源会分开计算.
  531. * Backup 是否备用回源,回源优先尝试主源
  532. */
  533. // public function putBucktSourceConfig(array $params)
  534. // {
  535. // $path = '/mirrorConfig/set';
  536. // $data = json_encode($params);
  537. // $info = $this->ucPostV2($path, $data);
  538. // return $info;
  539. // }
  540. /**
  541. * 获取空间回源配置
  542. */
  543. public function getBucktSourceConfig(array $params)
  544. {
  545. $path = '/mirrorConfig/get';
  546. $data = json_encode($params);
  547. $info = $this->ucPostV2($path, $data);
  548. return $info;
  549. }
  550. /**
  551. * 开关原图保护
  552. * mode 为1表示开启原图保护,0表示关闭
  553. */
  554. public function putBucketAccessStyleMode($bucket, $mode)
  555. {
  556. $path = '/accessMode/' . $bucket . '/mode/' . $mode;
  557. $info = $this->ucPost($path, null);
  558. return $info;
  559. }
  560. /**
  561. * 设置私有属性
  562. * private为0表示公开,为1表示私有
  563. */
  564. public function putBucketAccessMode($bucket, $private)
  565. {
  566. $path = '/bucket/' . $bucket . '/private/' . $private;
  567. $info = $this->ucPost($path, null);
  568. return $info;
  569. }
  570. /**
  571. * 设置referer防盗链
  572. * bucket=<BucketName>: bucket 名
  573. * mode=<AntiLeechMode>:
  574. * 0: 表示关闭Referer(使用此选项将会忽略以下参数并将恢复默认值);
  575. * 1: 表示设置Referer白名单; 2: 表示设置Referer黑名单
  576. * norefer=<NoRefer>: 0: 表示不允许空 Refer 访问;
  577. * 1: 表示允许空 Refer 访问
  578. * pattern=<Pattern>: 规则字符串, 当前允许格式分为三种:
  579. * 一种为空主机头域名, 比如 foo.com;
  580. * 一种是泛域名, 比如 *.bar.com; 一种是完全通配符, 即一个 *;
  581. * 多个规则之间用;隔开, 比如: foo.com;*.bar.com;sub.foo.com;*.sub.bar.com
  582. * 空主机头域名可以是多级域名,比如 foo.bar.com。
  583. * 多个域名之间不允许夹带空白字符。
  584. * source_enabled=:1
  585. */
  586. public function putReferAntiLeech($bucket, $mode, $norefer, $pattern, $enabled = 1)
  587. {
  588. $path = "/referAntiLeech?bucket=$bucket&mode=$mode&norefer=$norefer&pattern=$pattern&source_enabled=$enabled";
  589. $info = $this->ucPost($path, null);
  590. return $info;
  591. }
  592. /**
  593. * 设置Bucket的maxAge
  594. * maxAge为0或者负数表示为默认值(31536000)
  595. */
  596. public function putBucketMaxAge($bucket, $maxAge)
  597. {
  598. $path = '/maxAge?bucket=' . $bucket . '&maxAge=' . $maxAge;
  599. $info = $this->ucPost($path, null);
  600. return $info;
  601. }
  602. /**
  603. * 设置配额
  604. * <bucket>: 空间名称,不支持授权空间
  605. * <size>: 空间存储量配额,参数传入0或不传表示不更改当前配置,传入-1表示取消限额,
  606. * 新创建的空间默认没有限额。
  607. * <count>: 空间文件数配额,参数含义同<size>
  608. */
  609. public function putBucketQuota($bucket, $size, $count)
  610. {
  611. $path = '/setbucketquota/' . $bucket . '/size/' . $size . '/count/' . $count;
  612. $info = $this->apiPost($path, null);
  613. return $info;
  614. }
  615. /**
  616. * 获取配额
  617. * bucket 空间名称
  618. */
  619. public function getBucketQuota($bucket)
  620. {
  621. $path = '/getbucketquota/' . $bucket;
  622. $info = $this->apiPost($path, null);
  623. return $info;
  624. }
  625. /**
  626. * 获取资源的元信息,但不返回文件内容
  627. *
  628. * @param $bucket 待获取信息资源所在的空间
  629. * @param $key 待获取资源的文件名
  630. *
  631. * @return array 包含文件信息的数组,类似:
  632. * [
  633. * "hash" => "<Hash string>",
  634. * "key" => "<Key string>",
  635. * "fsize" => <file size>,
  636. * "putTime" => "<file modify time>"
  637. * "fileType" => <file type>
  638. * ]
  639. *
  640. * @link http://developer.qiniu.com/docs/v6/api/reference/rs/stat.html
  641. */
  642. public function stat($bucket, $key)
  643. {
  644. $path = '/stat/' . \Qiniu\entry($bucket, $key);
  645. return $this->rsGet($path);
  646. }
  647. /**
  648. * 删除指定资源
  649. *
  650. * @param $bucket 待删除资源所在的空间
  651. * @param $key 待删除资源的文件名
  652. *
  653. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  654. * @link http://developer.qiniu.com/docs/v6/api/reference/rs/delete.html
  655. */
  656. public function delete($bucket, $key)
  657. {
  658. $path = '/delete/' . \Qiniu\entry($bucket, $key);
  659. list(, $error) = $this->rsPost($path);
  660. return $error;
  661. }
  662. /**
  663. * 给资源进行重命名,本质为move操作。
  664. *
  665. * @param $bucket 待操作资源所在空间
  666. * @param $oldname 待操作资源文件名
  667. * @param $newname 目标资源文件名
  668. *
  669. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  670. */
  671. public function rename($bucket, $oldname, $newname)
  672. {
  673. return $this->move($bucket, $oldname, $bucket, $newname);
  674. }
  675. /**
  676. * 对资源进行复制。
  677. *
  678. * @param $from_bucket 待操作资源所在空间
  679. * @param $from_key 待操作资源文件名
  680. * @param $to_bucket 目标资源空间名
  681. * @param $to_key 目标资源文件名
  682. *
  683. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  684. * @link http://developer.qiniu.com/docs/v6/api/reference/rs/copy.html
  685. */
  686. public function copy($from_bucket, $from_key, $to_bucket, $to_key, $force = false)
  687. {
  688. $from = \Qiniu\entry($from_bucket, $from_key);
  689. $to = \Qiniu\entry($to_bucket, $to_key);
  690. $path = '/copy/' . $from . '/' . $to;
  691. if ($force === true) {
  692. $path .= '/force/true';
  693. }
  694. list(, $error) = $this->rsPost($path);
  695. return $error;
  696. }
  697. /**
  698. * 将资源从一个空间到另一个空间
  699. *
  700. * @param $from_bucket 待操作资源所在空间
  701. * @param $from_key 待操作资源文件名
  702. * @param $to_bucket 目标资源空间名
  703. * @param $to_key 目标资源文件名
  704. *
  705. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  706. * @link http://developer.qiniu.com/docs/v6/api/reference/rs/move.html
  707. */
  708. public function move($from_bucket, $from_key, $to_bucket, $to_key, $force = false)
  709. {
  710. $from = \Qiniu\entry($from_bucket, $from_key);
  711. $to = \Qiniu\entry($to_bucket, $to_key);
  712. $path = '/move/' . $from . '/' . $to;
  713. if ($force) {
  714. $path .= '/force/true';
  715. }
  716. list(, $error) = $this->rsPost($path);
  717. return $error;
  718. }
  719. /**
  720. * 主动修改指定资源的文件元信息
  721. *
  722. * @param $bucket 待操作资源所在空间
  723. * @param $key 待操作资源文件名
  724. * @param $mime 待操作文件目标mimeType
  725. *
  726. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  727. * @link http://developer.qiniu.com/docs/v6/api/reference/rs/chgm.html
  728. */
  729. public function changeMime($bucket, $key, $mime)
  730. {
  731. $resource = \Qiniu\entry($bucket, $key);
  732. $encode_mime = \Qiniu\base64_urlSafeEncode($mime);
  733. $path = '/chgm/' . $resource . '/mime/' . $encode_mime;
  734. list(, $error) = $this->rsPost($path);
  735. return $error;
  736. }
  737. /**
  738. * 修改指定资源的存储类型
  739. *
  740. * @param $bucket 待操作资源所在空间
  741. * @param $key 待操作资源文件名
  742. * @param $fileType 待操作文件目标文件类型
  743. *
  744. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  745. * @link https://developer.qiniu.com/kodo/api/3710/modify-the-file-type
  746. */
  747. public function changeType($bucket, $key, $fileType)
  748. {
  749. $resource = \Qiniu\entry($bucket, $key);
  750. $path = '/chtype/' . $resource . '/type/' . $fileType;
  751. list(, $error) = $this->rsPost($path);
  752. return $error;
  753. }
  754. /**
  755. * 修改文件的存储状态,即禁用状态和启用状态间的的互相转换
  756. *
  757. * @param $bucket 待操作资源所在空间
  758. * @param $key 待操作资源文件名
  759. * @param $status 待操作文件目标文件类型
  760. *
  761. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  762. * @link https://developer.qiniu.com/kodo/api/4173/modify-the-file-status
  763. */
  764. public function changeStatus($bucket, $key, $status)
  765. {
  766. $resource = \Qiniu\entry($bucket, $key);
  767. $path = '/chstatus/' . $resource . '/status/' . $status;
  768. list(, $error) = $this->rsPost($path);
  769. return $error;
  770. }
  771. /**
  772. * 从指定URL抓取资源,并将该资源存储到指定空间中
  773. *
  774. * @param $url 指定的URL
  775. * @param $bucket 目标资源空间
  776. * @param $key 目标资源文件名
  777. *
  778. * @return array 包含已拉取的文件信息。
  779. * 成功时: [
  780. * [
  781. * "hash" => "<Hash string>",
  782. * "key" => "<Key string>"
  783. * ],
  784. * null
  785. * ]
  786. *
  787. * 失败时: [
  788. * null,
  789. * Qiniu/Http/Error
  790. * ]
  791. * @link http://developer.qiniu.com/docs/v6/api/reference/rs/fetch.html
  792. */
  793. public function fetch($url, $bucket, $key = null)
  794. {
  795. $resource = \Qiniu\base64_urlSafeEncode($url);
  796. $to = \Qiniu\entry($bucket, $key);
  797. $path = '/fetch/' . $resource . '/to/' . $to;
  798. $ak = $this->auth->getAccessKey();
  799. $ioHost = $this->config->getIovipHost($ak, $bucket);
  800. $url = $ioHost . $path;
  801. return $this->post($url, null);
  802. }
  803. /**
  804. * 从镜像源站抓取资源到空间中,如果空间中已经存在,则覆盖该资源
  805. *
  806. * @param $bucket 待获取资源所在的空间
  807. * @param $key 代获取资源文件名
  808. *
  809. * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
  810. * @link http://developer.qiniu.com/docs/v6/api/reference/rs/prefetch.html
  811. */
  812. public function prefetch($bucket, $key)
  813. {
  814. $resource = \Qiniu\entry($bucket, $key);
  815. $path = '/prefetch/' . $resource;
  816. $ak = $this->auth->getAccessKey();
  817. $ioHost = $this->config->getIovipHost($ak, $bucket);
  818. $url = $ioHost . $path;
  819. list(, $error) = $this->post($url, null);
  820. return $error;
  821. }
  822. /**
  823. * 在单次请求中进行多个资源管理操作
  824. *
  825. * @param $operations 资源管理操作数组
  826. *
  827. * @return array 每个资源的处理情况,结果类似:
  828. * [
  829. * { "code" => <HttpCode int>, "data" => <Data> },
  830. * { "code" => <HttpCode int> },
  831. * { "code" => <HttpCode int> },
  832. * { "code" => <HttpCode int> },
  833. * { "code" => <HttpCode int>, "data" => { "error": "<ErrorMessage string>" } },
  834. * ...
  835. * ]
  836. * @link http://developer.qiniu.com/docs/v6/api/reference/rs/batch.html
  837. */
  838. public function batch($operations)
  839. {
  840. $params = 'op=' . implode('&op=', $operations);
  841. return $this->rsPost('/batch', $params);
  842. }
  843. /**
  844. * 设置文件的生命周期
  845. *
  846. * @param $bucket 设置文件生命周期文件所在的空间
  847. * @param $key 设置文件生命周期文件的文件名
  848. * @param $days 设置该文件多少天后删除,当$days设置为0时表示取消该文件的生命周期
  849. *
  850. * @return Mixed
  851. * @link https://developer.qiniu.com/kodo/api/update-file-lifecycle
  852. */
  853. public function deleteAfterDays($bucket, $key, $days)
  854. {
  855. $entry = \Qiniu\entry($bucket, $key);
  856. $path = "/deleteAfterDays/$entry/$days";
  857. list(, $error) = $this->rsPost($path);
  858. return $error;
  859. }
  860. private function getRsfHost()
  861. {
  862. $scheme = "http://";
  863. if ($this->config->useHTTPS == true) {
  864. $scheme = "https://";
  865. }
  866. return $scheme . Config::RSF_HOST;
  867. }
  868. private function getRsHost()
  869. {
  870. $scheme = "http://";
  871. if ($this->config->useHTTPS == true) {
  872. $scheme = "https://";
  873. }
  874. return $scheme . Config::RS_HOST;
  875. }
  876. private function getApiHost()
  877. {
  878. $scheme = "http://";
  879. if ($this->config->useHTTPS == true) {
  880. $scheme = "https://";
  881. }
  882. return $scheme . Config::API_HOST;
  883. }
  884. private function getUcHost()
  885. {
  886. $scheme = "http://";
  887. if ($this->config->useHTTPS == true) {
  888. $scheme = "https://";
  889. }
  890. return $scheme . Config::UC_HOST;
  891. }
  892. private function rsPost($path, $body = null)
  893. {
  894. $url = $this->getRsHost() . $path;
  895. return $this->post($url, $body);
  896. }
  897. private function apiPost($path, $body = null)
  898. {
  899. $url = $this->getApiHost() . $path;
  900. return $this->post($url, $body);
  901. }
  902. private function ucPost($path, $body = null)
  903. {
  904. $url = $this->getUcHost() . $path;
  905. return $this->post($url, $body);
  906. }
  907. private function ucGet($path)
  908. {
  909. $url = $this->getUcHost() . $path;
  910. return $this->get($url);
  911. }
  912. private function apiGet($path)
  913. {
  914. $url = $this->getApiHost() . $path;
  915. return $this->get($url);
  916. }
  917. private function rsGet($path)
  918. {
  919. $url = $this->getRsHost() . $path;
  920. return $this->get($url);
  921. }
  922. private function get($url)
  923. {
  924. $headers = $this->auth->authorization($url);
  925. $ret = Client::get($url, $headers);
  926. if (!$ret->ok()) {
  927. return array(null, new Error($url, $ret));
  928. }
  929. return array($ret->json(), null);
  930. }
  931. private function post($url, $body)
  932. {
  933. $headers = $this->auth->authorization($url, $body, 'application/x-www-form-urlencoded');
  934. $ret = Client::post($url, $body, $headers);
  935. if (!$ret->ok()) {
  936. return array(null, new Error($url, $ret));
  937. }
  938. $r = ($ret->body === null) ? array() : $ret->json();
  939. return array($r, null);
  940. }
  941. private function ucPostV2($path, $body)
  942. {
  943. $url = $this->getUcHost() . $path;
  944. return $this->postV2($url, $body);
  945. }
  946. private function postV2($url, $body)
  947. {
  948. $headers = $this->auth->authorizationV2($url, 'POST', $body, 'application/json');
  949. $headers["Content-Type"] = 'application/json';
  950. $ret = Client::post($url, $body, $headers);
  951. if (!$ret->ok()) {
  952. return array(null, new Error($url, $ret));
  953. }
  954. $r = ($ret->body === null) ? array() : $ret->json();
  955. return array($r, null);
  956. }
  957. public static function buildBatchCopy($source_bucket, $key_pairs, $target_bucket, $force)
  958. {
  959. return self::twoKeyBatch('/copy', $source_bucket, $key_pairs, $target_bucket, $force);
  960. }
  961. public static function buildBatchRename($bucket, $key_pairs, $force)
  962. {
  963. return self::buildBatchMove($bucket, $key_pairs, $bucket, $force);
  964. }
  965. public static function buildBatchMove($source_bucket, $key_pairs, $target_bucket, $force)
  966. {
  967. return self::twoKeyBatch('/move', $source_bucket, $key_pairs, $target_bucket, $force);
  968. }
  969. public static function buildBatchDelete($bucket, $keys)
  970. {
  971. return self::oneKeyBatch('/delete', $bucket, $keys);
  972. }
  973. public static function buildBatchStat($bucket, $keys)
  974. {
  975. return self::oneKeyBatch('/stat', $bucket, $keys);
  976. }
  977. public static function buildBatchDeleteAfterDays($bucket, $key_day_pairs)
  978. {
  979. $data = array();
  980. foreach ($key_day_pairs as $key => $day) {
  981. array_push($data, '/deleteAfterDays/' . \Qiniu\entry($bucket, $key) . '/' . $day);
  982. }
  983. return $data;
  984. }
  985. public static function buildBatchChangeMime($bucket, $key_mime_pairs)
  986. {
  987. $data = array();
  988. foreach ($key_mime_pairs as $key => $mime) {
  989. array_push($data, '/chgm/' . \Qiniu\entry($bucket, $key) . '/mime/' . base64_encode($mime));
  990. }
  991. return $data;
  992. }
  993. public static function buildBatchChangeType($bucket, $key_type_pairs)
  994. {
  995. $data = array();
  996. foreach ($key_type_pairs as $key => $type) {
  997. array_push($data, '/chtype/' . \Qiniu\entry($bucket, $key) . '/type/' . $type);
  998. }
  999. return $data;
  1000. }
  1001. private static function oneKeyBatch($operation, $bucket, $keys)
  1002. {
  1003. $data = array();
  1004. foreach ($keys as $key) {
  1005. array_push($data, $operation . '/' . \Qiniu\entry($bucket, $key));
  1006. }
  1007. return $data;
  1008. }
  1009. private static function twoKeyBatch($operation, $source_bucket, $key_pairs, $target_bucket, $force)
  1010. {
  1011. if ($target_bucket === null) {
  1012. $target_bucket = $source_bucket;
  1013. }
  1014. $data = array();
  1015. $forceOp = "false";
  1016. if ($force) {
  1017. $forceOp = "true";
  1018. }
  1019. foreach ($key_pairs as $from_key => $to_key) {
  1020. $from = \Qiniu\entry($source_bucket, $from_key);
  1021. $to = \Qiniu\entry($target_bucket, $to_key);
  1022. array_push($data, $operation . '/' . $from . '/' . $to . "/force/" . $forceOp);
  1023. }
  1024. return $data;
  1025. }
  1026. }