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.
176 lines
5.8 KiB
176 lines
5.8 KiB
5 years ago
|
<?php
|
||
|
/**
|
||
|
* Created by IntelliJ IDEA.
|
||
|
* User: luwei
|
||
|
* Date: 2017/10/24
|
||
|
* Time: 12:34
|
||
|
*/
|
||
|
|
||
|
namespace app\utils;
|
||
|
|
||
|
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];
|
||
|
}
|
||
|
}
|