Qiniu.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <?php
  2. namespace fast\service;
  3. use think\Config;
  4. use think\Log;
  5. /**
  6. * 七牛上传文件管理
  7. */
  8. class Qiniu
  9. {
  10. const QINIU_RS = 'http://rs.qbox.me';
  11. static $_config = null;
  12. /**
  13. * 获取文件
  14. *
  15. * @param string $domain 域名
  16. * @param string $name 文件名
  17. * @param string $param 附加参数
  18. * @return string
  19. */
  20. public static function download($domain, $name, $param = [])
  21. {
  22. $url = $domain . $name . '?' . http_build_query($param);
  23. $token = self::sign($url);
  24. return $url . '&token=' . $token;
  25. }
  26. /**
  27. * 重命名【移动】
  28. *
  29. * @param string $from 来源位置
  30. * @param string $to 目标位置
  31. * return bool
  32. */
  33. public static function move($from, $to)
  34. {
  35. // $bucket = $this->_config['bucket'];
  36. $op = '/move/' . self::qiniuEncode($from) . '/' . self::qiniuEncode($to);
  37. return self::opration($op);
  38. }
  39. /**
  40. * 复制文件
  41. *
  42. * @param string $from 来源文件
  43. * @param string $saveas 目标文件
  44. * @return bool
  45. */
  46. public static function copy($from, $saveas)
  47. {
  48. // $bucket = $this->_config['bucket'];
  49. $op = '/copy/' . self::qiniuEncode($from) . '/' . self::qiniuEncode($saveas);
  50. return self::opration($op);
  51. }
  52. /**
  53. * 获取token
  54. *
  55. * @param string $bucket 空间名
  56. * @param string $key 密钥
  57. * @param int $max 文件大小限制
  58. * @param int $timeout 超时时间
  59. * @return string
  60. */
  61. public static function getToken($bucket, $key, $max = 10485760, $timeout = 600)
  62. {
  63. $setting = array(
  64. 'scope' => $bucket,
  65. 'saveKey' => $key,
  66. 'deadline' => $timeout + $_SERVER['REQUEST_TIME'],
  67. 'fsizeLimit' => intval($max),
  68. );
  69. $setting = self::qiniuEncode(json_encode($setting));
  70. return self::sign($setting) . ':' . $setting;
  71. }
  72. /**
  73. * 删除
  74. *
  75. * @param string $uri 文件路径
  76. * @return boolean
  77. */
  78. public static function delete($uri)
  79. {
  80. $file = self::qiniuEncode($uri);
  81. return self::opration('/delete/' . $file);
  82. }
  83. /**
  84. * 判断文件是否存在
  85. *
  86. * @param string $uri
  87. * @return boolean
  88. */
  89. public static function has($uri)
  90. {
  91. $op = '/stat/' . self::qiniuEncode($uri);
  92. return self::opration($op);
  93. }
  94. /**
  95. * 转pdf
  96. *
  97. * @param string $bucket
  98. * @param string $key
  99. * @param string $saveas
  100. * @return boolean
  101. */
  102. public static function toPdf($bucket, $key, $saveas)
  103. {
  104. $API = 'http://api.qiniu.com';
  105. $op = '/pfop/';
  106. $data = 'bucket=' . $bucket . '&key=' . $key . '&fops=yifangyun_preview|saveas/' . self::qiniuEncode($saveas);
  107. return self::opration($op, $data, $API);
  108. }
  109. /**
  110. * 七牛操作
  111. *
  112. * @param string $op 操作命令
  113. * @param string $data 操作结果
  114. * @param string $host
  115. * @return boolean
  116. */
  117. private static function opration($op, $data = null, $host = self::QINIU_RS)
  118. {
  119. $token = self::sign(is_string($data) ? $op . "\n" . $data : $op . "\n");
  120. $url = $host . $op;
  121. $header = array('Authorization: QBox ' . $token);
  122. if ($ch = curl_init($url))
  123. {
  124. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  125. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  126. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
  127. if ($data)
  128. {
  129. curl_setopt($ch, CURLOPT_POST, true);
  130. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  131. }
  132. curl_setopt($ch, CURLOPT_HEADER, 1);
  133. $response = curl_exec($ch);
  134. $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  135. curl_close($ch);
  136. if ($status == 200)
  137. {
  138. return true;
  139. }
  140. // elseif (\Config::get('debug'))
  141. // {
  142. // /*操作出错*/
  143. // \Log::debug($response, '七牛请求出错');
  144. // }
  145. }
  146. Log::error('[QINIU]七牛错误' . $url . ':' . ($response ? : '请求失败'), 'ERROR');
  147. return false;
  148. }
  149. /**
  150. * 获取url签名
  151. *
  152. * @param string $url
  153. * @return string
  154. */
  155. private static function sign($url)
  156. {
  157. $config = self::$_config ? : (self::$_config = Config::get('service.qiniu'));
  158. $sign = hash_hmac('sha1', $url, $config['secretkey'], true);
  159. $ak = $config['accesskey'];
  160. return $ak . ':' . self::qiniuEncode($sign);
  161. }
  162. /**
  163. * 七牛安全编码
  164. */
  165. private static function qiniuEncode($str)
  166. {
  167. return strtr(base64_encode($str), ['+' => '-', '/' => '_']);
  168. }
  169. }