首頁 後端開發 php教程 PHP5.0~5.6 各版本相容性cURL檔案上傳功能

PHP5.0~5.6 各版本相容性cURL檔案上傳功能

Jun 01, 2018 am 11:51 AM
curl

這篇文章主要介紹了PHP5.0~5.6 各版本兼容性cURL文件上傳功能,結合實例形式分析了php各個常見版本進行curl文件上傳操作的相關實現技巧與注意事項,需要的朋友可以參考下

本文實例分析了PHP5.0~5.6 各版本相容性cURL檔案上傳功能。分享給大家供大家參考,具體如下:

最近做的一個需求,要透過PHP呼叫cURL,以multipart/form-data格式上傳檔案。踩坑若干,就夠一篇了。

重要警告

沒事不要讀PHP的官方中文文件!版本跟不上坑死你!

不同版本PHP之間cURL的區別

#PHP的cURL支援透過給CURL_POSTFIELDS#傳遞關聯數組(而不是字串)來產生multipart/form-data的POST請求。

傳統上,PHP的cURL支援透過在數組資料中,使用「@ 檔案全路徑」的語法附加文件,供cURL讀取上傳。這與命令列直接呼叫cURL程式的語法是一致的:

curl_setopt(ch, CURLOPT_POSTFIELDS, array(
  'file' => '@'.realpath('image.png'),
));
登入後複製

equals

##

$ curl -F "file=@/absolute/path/to/image.png" <url>
登入後複製

#但PHP從5.5開始引進了新的CURLFile類別用來指向檔案。 CURLFile類別也可以詳細定義MIME類型、檔案名稱等可能出現在multipart/form-data資料中的附加資訊。 PHP推薦使用CURLFile取代舊的

@語法:

curl_setopt(ch, CURLOPT_POSTFIELDS, [
  &#39;file&#39; => new CURLFile(realpath(&#39;image.png&#39;)),
]);
登入後複製

PHP 5.5另外引進了

CURL_SAFE_UPLOAD選項,可以強制PHP的cURL模組拒絕舊的@語法,只接受CURLFile式的檔案。 5.5的預設值為false,5.6的預設值為true。

但坑的一點在於:

@語法在5.5就已經被打了deprecated,在5.6中就直接被刪除了(會產生ErorException: The usage of the @ filename API for file uploading is deprecated. Please use the CURLFile class instead)。

對於PHP 5.6 而言,手動設定

CURL_SAFE_UPLOAD為false是毫無意義的。根本不是字面意義理解的「設定成false,就能開啟舊的unsafe的方式」——舊的方式已經作為廢棄語法徹底不存在了。 PHP 5.6 == CURLFile only,不要有任何的幻想。

我的部署環境是5.4(

僅@語法),但開發環境是5.6(僅CURLFile)。都沒有壓在5.5這個兩者都支援過渡版本上,結果就是必須寫出兩個有環境判斷的程式碼。

現在問題來了…

環境判斷:小心魔法數字!

我看過這種環境判斷的程式碼:

if (version_compare(phpversion(), &#39;5.4.0&#39;) >= 0)
登入後複製

我對這種程式碼的評價只有一個字:屎。

這個判斷掉進了典型的魔法數字陷阱。版本號莫名其妙的出現在代碼之中,不查半天PHP手冊和更新歷史,很難明白作者被卡在了哪個功能的變更上。

程式碼應該回歸本源。我們的實際需求其實是:有CURLFile就優先採用,沒有再退化到傳統

@文法。那麼程式碼就來了:

if (class_exists(&#39;\CURLFile&#39;)) {
  $field = array(&#39;fieldname&#39; => new \CURLFile(realpath($filepath)));
} else {
  $field = array(&#39;fieldname&#39; => &#39;@&#39; . realpath($filepath));
}
登入後複製

#建議明確指定的退化選項##從可靠的角度,建議指定

CURL_SAFE_UPLOAD

的值,明確告知php是容忍還是禁止舊的@語法。注意在低版本PHP中CURLOPT_SAFE_UPLOAD#常數本身可能不存在,需要判斷:

if (class_exists(&#39;\CURLFile&#39;)) {
  curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
} else {
  if (defined(&#39;CURLOPT_SAFE_UPLOAD&#39;)) {
    curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
  }
}
登入後複製

cURL選項設定的順序不管是

curl_setopt()

單發還是curl_setopt_array()批量,cURL的選項總是設定一個生效一個,而設定好的選項立刻就會影響cURL在設定後續選項時的行為。 例如

CURLOPT_SAFE_UPLOAD

就和CURLOPT_POSTFIELDS的行為有關。如果先設定CURLOPT_POSTFIELDS再設定CURLOPT_SAFE_UPLOAD,那麼後者的約束作用就不會生效。因為設定前者時cURL就已經把資料實際的識讀處理完畢了! cURL有那麼幾個選項存在這種坑,務必小心。還好這種存在「依賴關係」的選項不多,機制也不複雜,簡單處理即可。我的方法是先批次設定所有的選項,然後直到

curl_exec()

的前一刻才用curl_setopt()單發設定CURLOPT_POSTFIELDS<p>實際上在<code>curl_setopt_array()使用的陣列中,保證CURLOPT_POSTFIELDS的位置在後邊也是可靠的。 PHP的關聯數組是有順序保障的,我們也可以假設curl_setopt_array()內部的執行順序一定是從頭到尾按順序(好吧我知道assume不是件好事,不過有些實在過分淺顯的事實,就容我下個最低限度的斷言吧),所以盡可放心。

我的做法只是在程式碼表現上加個多餘的保險,突顯強調順序的重要性防以後手賤。

命名空間

PHP 5.2或以下的版本沒有命名空間。程式碼中用到了空間分隔符號\就會引發解析器錯誤。要照顧PHP 5.2其實容易想,放棄命名空間就好。

要注意的反轉是有命名空間的PHP 5.3 。無論是呼叫CURLFile或是用class_exists()判斷CURLFile的存在性,都建議寫成\CURLFile明確指定頂層空間,防止程式碼包裹在命名空間內的時候崩掉。

相關推薦:

可相容php5與php7的cURL檔案上傳功能

以上是PHP5.0~5.6 各版本相容性cURL檔案上傳功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

python中CURL和python requests的相互轉換如何實現 python中CURL和python requests的相互轉換如何實現 May 03, 2023 pm 12:49 PM

curl和Pythonrequests都是發送HTTP請求的強大工具。雖然curl是一種命令列工具,可讓您直接從終端機發送請求,但Python的請求庫提供了一種更具程式化的方式來從Python程式碼發送請求。將curl轉換為Pythonrequestscurl指令的基本語法如下所示:curl[OPTIONS]URL將curl指令轉換為Python請求時,我們需要將選項和URL轉換為Python程式碼。這是一個範例curlPOST指令:curl-XPOSThttps://example.com/api

Linux下更新curl版本教程! Linux下更新curl版本教程! Mar 07, 2024 am 08:30 AM

在Linux下更新curl版本,您可以按照以下步驟進行操作:檢查目前curl版本:首先,您需要確定目前系統中安裝的curl版本。開啟終端,並執行以下指令:curl--version該指令將顯示目前curl的版本資訊。確認可用的curl版本:在更新curl之前,您需要確定可用的最新版本。您可以造訪curl的官方網站(curl.haxx.se)或相關的軟體來源,尋找最新版本的curl。下載curl原始碼:使用curl或瀏覽器,下載您選擇的curl版本的原始碼檔案(通常為.tar.gz或.tar.bz2

PHP8.1發布:引入curl多個請求並發處理 PHP8.1發布:引入curl多個請求並發處理 Jul 08, 2023 pm 09:13 PM

PHP8.1發布:引入curl多個請求並發處理近日,PHP官方發布了最新版本的PHP8.1,其中引入了一個重要的特性:curl多個請求並發處理。這個新功能為開發者提供了一個更有效率和靈活的方式來處理多個HTTP請求,大大提升了效能和使用者體驗。在以往的版本中,處理多個請求往往需要透過建立多個curl資源,並使用循環來分別發送和接收資料。這種方式雖然能夠實現目

從頭到尾:如何使用php擴充cURL進行HTTP請求 從頭到尾:如何使用php擴充cURL進行HTTP請求 Jul 29, 2023 pm 05:07 PM

從頭到尾:如何使用php擴充cURL進行HTTP請求引言:在Web開發中,經常需要與第三方API或其他遠端伺服器進行通訊。而使用cURL進行HTTP請求是一種常見且強大的方式。本文將介紹如何使用php擴充cURL來執行HTTP請求,並提供一些實用的程式碼範例。一、準備工作首先,請確保php已安裝cURL擴充。可以在命令列執行php-m|grepcurl查

PHP Curl中如何處理網頁的 301 重定向? PHP Curl中如何處理網頁的 301 重定向? Mar 08, 2024 am 11:36 AM

PHPCurl中如何處理網頁的301重定向?使用PHPCurl發送網路請求時,常會遇到網頁回傳的301狀態碼,表示頁面被永久重定向。為了正確處理這種情況,我們需要在Curl請求中加入一些特定的選項和處理邏輯。以下將詳細介紹在PHPCurl中如何處理網頁的301重定向,並提供具體的程式碼範例。 301重定向處理原理301重定向是指伺服器回傳了一個30

linux curl是什麼 linux curl是什麼 Apr 20, 2023 pm 05:05 PM

在linux中,curl是一個非常實用的、用來與伺服器之間傳輸資料的工具,是一個利用URL規則在命令列下工作的檔案傳輸工具;它支援檔案的上傳和下載,是綜合傳輸工具。 curl提供了一大堆非常有用的功能,包括代理存取、使用者認證、ftp上傳下載、HTTP POST、SSL連線、cookie支援、斷點續傳等等。

php curl怎麼設定cookie php curl怎麼設定cookie Sep 26, 2021 am 09:27 AM

php curl設定cookie的方法:1、建立PHP範例檔;2、透過「curl_setopt」函數設定cURL傳輸選項;3、在CURL中傳遞cookie即可。

PHP Fatal error: Call to undefined function curl_setopt()的解決方法 PHP Fatal error: Call to undefined function curl_setopt()的解決方法 Jun 23, 2023 am 08:18 AM

PHP是一種廣泛使用的開源腳本語言,被許多網站所使用。然而,有時候你可能會遇到PHPFatalerror:Calltoundefinedfunctioncurl_setopt()這個問題,這個問題也許會使你的網站無法正常運作。那麼這個問題到底是什麼原因造成的呢?在PHP中,curl_setopt()是一個非常重要的函數,它用於透過curl擴展庫

See all articles