CurlHelper.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\utils;
  8. class CurlHelper
  9. {
  10. public static $auto_redirect = true;
  11. public static $curl_info;
  12. public static $curl_errno;
  13. public static $curl_error;
  14. public static $response;
  15. public static function get($url, $data = [])
  16. {
  17. if (is_array($data) || is_object($data)) {
  18. $url = trim($url, '&');
  19. $url = trim($url, '?');
  20. if (strpos($url, '?') !== false) {
  21. $url = $url . '&' . http_build_query($data);
  22. } else {
  23. $url = $url . '?' . http_build_query($data);
  24. }
  25. }
  26. $ch = curl_init($url);
  27. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  28. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  29. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  30. self::$response = curl_exec($ch);
  31. self::$curl_errno = curl_errno($ch);
  32. self::$curl_error = curl_error($ch);
  33. self::$curl_info = curl_getinfo($ch);
  34. curl_close($ch);
  35. if (self::$auto_redirect && in_array(self::$curl_info['http_code'], [301, 302])) {
  36. return self::get(self::$curl_info['redirect_url'], $data);
  37. }
  38. return self::$response;
  39. }
  40. public static function post($url, $data = [])
  41. {
  42. if (is_array($data) || is_object($data)) {
  43. $data = http_build_query($data);
  44. }
  45. $ch = curl_init($url);
  46. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  47. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  48. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  49. curl_setopt($ch, CURLOPT_POST, true);
  50. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  51. self::$response = curl_exec($ch);
  52. self::$curl_errno = curl_errno($ch);
  53. self::$curl_error = curl_error($ch);
  54. self::$curl_info = curl_getinfo($ch);
  55. curl_close($ch);
  56. if (self::$auto_redirect && in_array(self::$curl_info['http_code'], [301, 302])) {
  57. return self::post(self::$curl_info['redirect_url'], $data);
  58. }
  59. return self::$response;
  60. }
  61. /**
  62. * 下载文件,GET方式提交
  63. * @param $url
  64. * @param $save_file string 文件保存路径
  65. * @param array $data GET方式提交数据
  66. * @return mixed
  67. */
  68. public static function download($url, $save_file, $data = [])
  69. {
  70. if ($save_file === null || $save_file === '') {
  71. return false;
  72. }
  73. $fp_output = fopen($save_file, 'w');
  74. if (is_array($data) || is_object($data)) {
  75. $url = trim($url, '&');
  76. $url = trim($url, '?');
  77. if (strpos($url, '?') !== false) {
  78. $url = $url . '&' . http_build_query($data);
  79. } else {
  80. $url = $url . '?' . http_build_query($data);
  81. }
  82. }
  83. $ch = curl_init($url);
  84. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  85. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  86. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  87. curl_setopt($ch, CURLOPT_FILE, $fp_output);
  88. self::$response = curl_exec($ch);
  89. self::$curl_errno = curl_errno($ch);
  90. self::$curl_error = curl_error($ch);
  91. self::$curl_info = curl_getinfo($ch);
  92. curl_close($ch);
  93. if (self::$auto_redirect && in_array(self::$curl_info['http_code'], [301, 302])) {
  94. return self::download(self::$curl_info['redirect_url'], $save_file, $data);
  95. }
  96. return self::$response;
  97. }
  98. /**
  99. * POST方式提交;
  100. * 兼容PHP5.5要求使用CURLFile上传文件,内部自动处理@开头标记的文件
  101. * @param $url
  102. * @param array $data ['mydata'=>'123','image1'=>'@/path/to/file','image2'=>'@/path/to/file']
  103. * @return mixed
  104. */
  105. public static function upload($url, $data = [])
  106. {
  107. if (function_exists('curl_file_create')) {
  108. foreach ($data as $k => $v) {
  109. if (strpos($v, '@') === 0) {
  110. $data[$k] = curl_file_create(trim($v, '@'));
  111. }
  112. }
  113. }
  114. $ch = curl_init($url);
  115. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  116. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  117. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  118. curl_setopt($ch, CURLOPT_POST, true);
  119. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  120. self::$response = curl_exec($ch);
  121. self::$curl_errno = curl_errno($ch);
  122. self::$curl_error = curl_error($ch);
  123. self::$curl_info = curl_getinfo($ch);
  124. curl_close($ch);
  125. if (self::$auto_redirect && in_array(self::$curl_info['http_code'], [301, 302])) {
  126. return self::upload(self::$curl_info['redirect_url'], $data);
  127. }
  128. return self::$response;
  129. }
  130. /**
  131. * 根据路径或网址格式获取文件名
  132. * @param string $str 例:http://a.com/filename.txt或/home/filename.txt
  133. * @return mixed|null
  134. */
  135. public static function getFileName($str)
  136. {
  137. if ($str === '' || $str === null) {
  138. return null;
  139. }
  140. $names = mb_split('/', $str);
  141. if (!is_array($names)) {
  142. return null;
  143. }
  144. return $names[count($names) - 1];
  145. }
  146. /**
  147. * 根据文件名或文件路径获取文件后缀
  148. * @param $str
  149. * @return mixed|null
  150. */
  151. public static function getFileExtension($str)
  152. {
  153. $str = self::getFileName($str);
  154. if ($str === '' || $str === null) {
  155. return null;
  156. }
  157. $names = mb_split('\.', $str);
  158. if (!is_array($names)) {
  159. return null;
  160. }
  161. if (count($names) == 1) {
  162. return '';
  163. }
  164. return $names[count($names) - 1];
  165. }
  166. }