You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
5.8 KiB
171 lines
5.8 KiB
<?php |
|
/** |
|
* Created by IntelliJ IDEA. |
|
* User: luwei |
|
* Date: 2017/10/24 |
|
* Time: 12:34 |
|
*/ |
|
|
|
namespace app\extensions; |
|
|
|
|
|
class CurlHelper |
|
{ |
|
public static $auto_redirect = true; |
|
public static $curl_info; |
|
public static $curl_errno; |
|
public static $curl_error; |
|
public static $response; |
|
|
|
public static function get($url, $data = []) |
|
{ |
|
if (is_array($data) || is_object($data)) { |
|
$url = trim($url, '&'); |
|
$url = trim($url, '?'); |
|
if (strpos($url, '?') !== false) { |
|
$url = $url . '&' . http_build_query($data); |
|
} else { |
|
$url = $url . '?' . http_build_query($data); |
|
} |
|
} |
|
$ch = curl_init($url); |
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); |
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); |
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
|
self::$response = curl_exec($ch); |
|
self::$curl_errno = curl_errno($ch); |
|
self::$curl_error = curl_error($ch); |
|
self::$curl_info = curl_getinfo($ch); |
|
curl_close($ch); |
|
if (self::$auto_redirect && in_array(self::$curl_info['http_code'], [301, 302])) { |
|
return self::get(self::$curl_info['redirect_url'], $data); |
|
} |
|
return self::$response; |
|
} |
|
|
|
public static function post($url, $data = []) |
|
{ |
|
if (is_array($data) || is_object($data)) { |
|
$data = http_build_query($data); |
|
} |
|
$ch = curl_init($url); |
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); |
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); |
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
|
curl_setopt($ch, CURLOPT_POST, true); |
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); |
|
self::$response = curl_exec($ch); |
|
self::$curl_errno = curl_errno($ch); |
|
self::$curl_error = curl_error($ch); |
|
self::$curl_info = curl_getinfo($ch); |
|
curl_close($ch); |
|
if (self::$auto_redirect && in_array(self::$curl_info['http_code'], [301, 302])) { |
|
return self::post(self::$curl_info['redirect_url'], $data); |
|
} |
|
return self::$response; |
|
} |
|
|
|
|
|
/** |
|
* 下载文件,GET方式提交 |
|
* @param $url |
|
* @param $save_file string 文件保存路径 |
|
* @param array $data GET方式提交数据 |
|
* @return mixed |
|
*/ |
|
public static function download($url, $save_file, $data = []) |
|
{ |
|
if ($save_file === null || $save_file === '') |
|
return false; |
|
$fp_output = fopen($save_file, 'w'); |
|
if (is_array($data) || is_object($data)) { |
|
$url = trim($url, '&'); |
|
$url = trim($url, '?'); |
|
if (strpos($url, '?') !== false) { |
|
$url = $url . '&' . http_build_query($data); |
|
} else { |
|
$url = $url . '?' . http_build_query($data); |
|
} |
|
} |
|
$ch = curl_init($url); |
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); |
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); |
|
curl_setopt($ch, CURLOPT_FILE, $fp_output); |
|
self::$response = curl_exec($ch); |
|
self::$curl_errno = curl_errno($ch); |
|
self::$curl_error = curl_error($ch); |
|
self::$curl_info = curl_getinfo($ch); |
|
curl_close($ch); |
|
if (self::$auto_redirect && in_array(self::$curl_info['http_code'], [301, 302])) { |
|
return self::download(self::$curl_info['redirect_url'], $save_file, $data); |
|
} |
|
return self::$response; |
|
} |
|
|
|
/** |
|
* POST方式提交; |
|
* 兼容PHP5.5要求使用CURLFile上传文件,内部自动处理@开头标记的文件 |
|
* @param $url |
|
* @param array $data ['mydata'=>'123','image1'=>'@/path/to/file','image2'=>'@/path/to/file'] |
|
* @return mixed |
|
*/ |
|
public static function upload($url, $data = []) |
|
{ |
|
if (function_exists('curl_file_create')) { |
|
foreach ($data as $k => $v) { |
|
if (strpos($v, '@') === 0) { |
|
$data[$k] = curl_file_create(trim($v, '@')); |
|
} |
|
} |
|
} |
|
$ch = curl_init($url); |
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); |
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); |
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
|
curl_setopt($ch, CURLOPT_POST, true); |
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); |
|
self::$response = curl_exec($ch); |
|
self::$curl_errno = curl_errno($ch); |
|
self::$curl_error = curl_error($ch); |
|
self::$curl_info = curl_getinfo($ch); |
|
curl_close($ch); |
|
if (self::$auto_redirect && in_array(self::$curl_info['http_code'], [301, 302])) { |
|
return self::upload(self::$curl_info['redirect_url'], $data); |
|
} |
|
return self::$response; |
|
} |
|
|
|
/** |
|
* 根据路径或网址格式获取文件名 |
|
* @param string $str 例:http://a.com/filename.txt或/home/filename.txt |
|
* @return mixed|null |
|
*/ |
|
public static function getFileName($str) |
|
{ |
|
if ($str === '' || $str === null) |
|
return null; |
|
$names = mb_split('/', $str); |
|
if (!is_array($names)) |
|
return null; |
|
return $names[count($names) - 1]; |
|
} |
|
|
|
/** |
|
* 根据文件名或文件路径获取文件后缀 |
|
* @param $str |
|
* @return mixed|null |
|
*/ |
|
public static function getFileExtension($str) |
|
{ |
|
$str = self::getFileName($str); |
|
if ($str === '' || $str === null) |
|
return null; |
|
$names = mb_split('\.', $str); |
|
if (!is_array($names)) |
|
return null; |
|
if (count($names) == 1) |
|
return ''; |
|
return $names[count($names) - 1]; |
|
} |
|
|
|
} |