在PHP5.5之前的版本,curl上传文件的方法是使用 @+文件绝对路径 将post数组传递给 CURLOPT_POSTFIELDS
curl_setopt(ch, CURLOPT_POSTFIELDS, array('file'=> '@'.realpath('file.png')));
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 上传图片,如有侵权,请您及时联系!
总结:之所以处理curl图片上传时踩了很多的坑,究竟其根本还是对Http协议不了解,对底层的知识点掌握的不牢固;对apache和php交互还不是很好;发奋图强研读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;
}
参考文献: