在PHP5.5以前的版本,curl上傳文件的方法是使用 @+文件絕對路徑 將post數組傳遞給 CURLOPT_POSTFIELDSphp
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類 的使用方法html
curl_setopt($curl, CURLOPT_POSTFIELDS, ['name'=> new CURLFile('文件絕對路徑','文件類型(image/jpeg)'),]);
下面是本身寫的一個curl發送請求方法,可附加附件web
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); }
聲明:apache
以上轉載與本文,PHP CURL 上傳圖片,若有侵權,請您及時聯繫!json
總結:之因此處理curl圖片上傳時踩了不少的坑,究竟其根本仍是對Http協議不瞭解,對底層的知識點掌握的不牢固;對apache和php交互還不是很好;發奮圖強研讀RFC2616,這些知識點也是web開發工程師必備之一。segmentfault
本身寫的函數數組
/** * 上傳文件 * * @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; }
參考文獻:cookie