PHP cURL上傳圖片

在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

curl函數和curl_error錯誤碼說明app

考慮 PHP 5.0~5.6 各版本兼容性的 cURL 文件上傳curl

PHP CURL 上傳圖片

相關文章
相關標籤/搜索