1. 云栖社区>
  2. PHP教程>
  3. 正文

PHP Curl上传图片

作者:用户 来源:互联网 时间:2017-12-01 20:57:18

curlphp图片上传

PHP Curl上传图片 - 摘要: 本文讲的是PHP Curl上传图片, 在PHP5.5之前的版本,curl上传文件的方法是使用 @+文件绝对路径将post数组传递给 CURLOPT_POSTFIELDS```curl_setopt(ch, CURLOPT_POSTFIELDS, array('file'=&g



PHP5.5之前的版本,curl上传文件的方法是使用 @+文件绝对路径
将post数组传递给 CURLOPT_POSTFIELDS
```
curl_setopt(ch, CURLOPT_POSTFIELDS, array('file'=> '@'.realpath('file.png')));
```
在5.5版本之后引入了 CURLFile类
http://php.net/manual/zh/curlfile.construct.php
另外也引入了 CURL_SAFE_UPLOAD 选项,可以强制PHP的cURL模块拒绝旧的@语法,仅接受CURLFile式的文件。5.5的默认值为false,5.6的默认值为true。并且5.6已经移除了 @+文件绝对路径 这种上传文件的方法。
CURLFile类 的使用方法
```
curl_setopt($curl, CURLOPT_POSTFIELDS, ['name'=> new CURLFile('文件绝对路径','文件类型(image/jpeg)'),]);
```
下面是自己写的一个curl发送请求方法,可附加附件
```
public function Https_request( $url ,$data = null, $cookie =null, $file =null) {
$curl= curl_init ();
curl_setopt ( $curl, CURLOPT_URL, $url);
curl_setopt ( $curl
, CURLOPT_SSL_VERIFYPEER, FALSE );curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, FALSE );
//携带cookie文件
if(! empty($cookie)){
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie); //读取cookie
}
//携带头
if(!empty($header)){
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
}
//上传文件
if(!empty($file)){
$file_obj=new CURLFile($file['realpath'],$file['type']);
$data["{$file['name']}"]=$file_obj;
}
//发送post数据
if(! empty( $data) && !isset($file_obj)) {
curl_setopt ( $curl, CURLOPT_POST, 1 );
curl_setopt ( $curl, CURLOPT_POSTFIELDS, http_build_query($data) );
}elseif(!empty($data)){
curl_setopt ( $curl, CURLOPT_POST, 1 );
curl_setopt ( $curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 );
$output= curl_exec ( $curl);
if(empty($output)) return false;
curl_close ( $curl);
return is_null(json_decode($output))?$output:json_decode($output,true);
}
```
声明:
以上转载与本文,[PHP CURL 上传图片](http://www.jianshu.com/p/6a8e11a0d667),如有侵权,请您及时联系!
总结:之所以处理curl图片上传时踩了很多的坑,究竟其根本还是对**Http**协议不了解,对底层的知识点掌握的不牢固;对apache和php交互还不是很好;发奋图强研读[RFC2616](https://tools.ietf.org/html/rfc2616),这些知识点也是web开发工程师必备之一。
自己写的函数
```
/**
* 上传文件
*
* @param string $url 访问链接
* @param mixed $params POST的提交数据
* @param string $timeout 超时时间
*
* @return json
*/
public function upload($url, $param, $timeout) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); // 设置访问链接
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);// 是否返回信息
curl_setopt($ch, CURLOPT_HEADER, 'Content-type: application/json'); // 设置返回信息数据格式 application/json
curl_setopt($ch, CURLOPT_POST, TRUE);// 设置post方式提交
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param)); // POST提交数据
$keyName = array_keys($_FILES);
$curlFile = new /CURLFile($_FILES[$keyName[0]]['tmp_name'], $_FILES[$keyName[0]]['type'], $_FILES[$keyName[0]]['name']);
curl_setopt($ch, CURLOPT_POSTFIELDS, [$keyName[0] => $curlFile]); // POST提交文件
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);// 超时时间
$result = curl_exec($ch);
$err_no = curl_errno($ch);// 获取错误编号,0为正常
curl_close($ch);
if ($err_no) {
return '请求失败,错误码:' . $err_no;
} elseif (is_null(json_decode($result))) {
return '请求返回异常:' . $result;
}
return $result;
}
```参考文献:
[curl函数和curl_error错误码说明]( curl函数和curl_errno错误码说明)
[考虑 PHP 5.0~5.6 各版本兼容性的 cURL 文件上传](https://segmentfault.com/a/1190000000725185)
[PHP CURL 上传图片](http://www.jianshu.com/p/6a8e11a0d667)

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索curl , php , 图片 上传 ,以便于您获取更多的相关知识。