PHP CURL的用法及上传图片

简介

curl是一个非常强大的开源库,可以使用URL的语法模拟浏览器来传输数据,支持多种协议,FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP等协议都可以很好的支持,包括一些:HTTPS认证,HTTP POST方法,HTTP PUT方法,FTP上传,keyberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证,下载文件断点续传,上传文件断点续传,http代理服务器管道,甚至它还支持IPv6,scoket5代理服务器,通过http代理服务器上传文件到FTP服务器等等,还可以抓取网页

您需要在php.ini中开启curl扩展才可以使用它

使用

基本步骤

先了解下它的基本步骤,分为4步

  1. 初始化创建会话   curl_init()
  2. 设置属性      curl_setopt()
  3. 执行并获取结果   curl_exec()
  4. 释放句柄      curl_close()

基础命令

 1 //创建了一个curl会话资源,成功返回一个句柄
 2 $ch = curl_init(); 
 3 //设置url
 4 curl_setopt($ch, CURLOPT_URL, "baidu.com"); 
 5 //如何处理获取的信息,1(true):是以文件流的形式返回 0(false):是直接echo输出
 6 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
 7 //设置为post请求,1:是 0:否
 8 curl_setopt($ch, CURLOPT_POST,1);
 9 //请求默认超时时间
10 curl_setopt($ch, CURLOPT_TIMEOUT, 60);
11 //0 or false 为不检查证书 测试时候可以设置
12 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
13 //post数据的时候进行数据提交,此命令略坑。
14 //使用 curl 并且参数为数据时,向服务器提交数据时,
15 //http头会发送content_type: application/x-www-form-urlencoded。
16 //这个是正常的网页<form>提交表单时,浏览器发送的头部。
17 //而 multipart/form-data 知道这是用于上传文件的表单。包括了 boundary 分界符,会多出很多字节。
18 //在没有需要上传文件的情况下,尽量对 post 提交的数据进行 http_build_query 处理,再发送
19 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
20 // 执行,然后将响应结果存入$output变量
21 $output = curl_exec($ch); 
22 //捕获句柄执行错误信息
23 $error = curl_error($ch);
24 // 关闭这个curl会话资源
25 curl_close($ch);    

curl_setopt可以用curl_setopt_array()代替,并将参数以数组的形式传入

1 $opts = array(
2     CURLOPT_TIMEOUT => 60,
3     CURLOPT_RETURNTRANSFER => 1,
4     ...
5 );
6 curl_setopt_array($ch, $opts);

GET请求

 1 /**
 2  * GET请求
 3  * @param string $url 请求路径
 4  * @param array $params 请求参数数组
 5  * @param int $timeout 超时时间
 6  */
 7 public function curlGet($url, $params = [], $timeout = 5)
 8 {
 9     $url = $url . "?" . http_build_query($params);
10     $ch = curl_init($url);
11     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
12     curl_setopt($ch, CURLOPT_HEADER, 0);
13     curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
14     $output  = curl_exec($ch);
15     if ($output === FALSE) {
16         echo "CURL GET Error:" . curl_error($ch);
17     }
18     curl_close($ch);
19     return $output;
20 }

POST请求

 1 /**
 2  * POST
 3  * @param string $url 请求路径
 4  * @param array $params 请求参数数组
 5  * @param int $timeout 超时时间
 6  */
 7 public static function curlPost($url, $params = [], $timeout = 5)
 8 {
 9     $curl = curl_init($url);
10     curl_setopt($curl, CURLOPT_HEADER, 0);
11     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
12     curl_setopt($curl, CURLOPT_POST, 1);
13     curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));
14     $data = curl_exec($curl);
15     curl_close($curl);
16     return $data;
17 }

上传图片

这里需要注意一个PHP版本的坑

在5.6版本以下在图片路径地址前加上@符号即可,而PHP5.6版本则需要使用新得方法new CURLFile(图片路径);方可执行。

或者还是用原来的方法在CURLOPT_POSTFIELDS设置项前加上CURLOPT_SAFE_UPLOAD设置项,设为FALSE。即curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);

 1 /**
 2  * 上传图片
 3  * @param string $url 上传地址
 4  * @param string $params 要上传的图片的路径
 5  */
 6 public function uploadImg($url, $path)
 7 {
 8     $curlPost = array('file' => new CURLFile(realpath($path)));
 9     $ch = curl_init();
10     curl_setopt($ch, CURLOPT_URL, $url);
11     curl_setopt($ch, CURLOPT_HEADER, 0);
12     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
13     curl_setopt($ch, CURLOPT_POST, 1); //POST提交
14     curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
15     $data = curl_exec($ch);
16     curl_close($ch);
17     return $data;
18 }

另一台服务器接收传过来的图片并上传到服务器

 1 $path = 'img/' . date('Ymd'); // 上传路径
 2 if (is_uploaded_file($_FILES['file']['tmp_name'])) { // 是否有上传文件
 3     $ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); // 获取后缀名
 4     $newName = time() . mt_rand() . '.' . $ext; // 用时间戳和随机数取名
 5     if (!file_exists($path)) { // 检测目录是否存在
 6         if (!mkdir($path, 0775, true)) { // 创建目录
 7             echo '创建目录失败';
 8             exit;
 9         };
10     }
11     if (move_uploaded_file($_FILES['file']['tmp_name'], $path . '/' . $newName)) { // 将上传的文件移动到新位置
12         echo '上传成功';
13     } else {
14         echo '上传失败';
15     }
16 }

 

posted @ 2021-01-06 10:54  九鹤  阅读(1327)  评论(0编辑  收藏  举报