搜尋
首頁後端開發php教程PHP5.0~5.6 各版本相容性cURL檔案上傳功能實例分析php技巧

這篇文章主要介紹了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文PHP區塊查詢實作方法分析

php技巧件上傳功能實例分析php技巧

#PHP折半查找演算法實例分析php技巧

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

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

您如何從PHP會話中檢索數據?您如何從PHP會話中檢索數據?May 01, 2025 am 12:11 AM

ToretrievedatafromaPHPsession,startthesessionwithsession_start()andaccessvariablesinthe$_SESSIONarray.Forexample:1)Startthesession:session_start().2)Retrievedata:$username=$_SESSION['username'];echo"Welcome,".$username;.Sessionsareserver-si

您如何使用會議來實施購物車?您如何使用會議來實施購物車?May 01, 2025 am 12:10 AM

利用會話構建高效購物車系統的步驟包括:1)理解會話的定義與作用,會話是服務器端的存儲機制,用於跨請求維護用戶狀態;2)實現基本的會話管理,如添加商品到購物車;3)擴展到高級用法,支持商品數量管理和刪除;4)優化性能和安全性,通過持久化會話數據和使用安全的會話標識符。

您如何在PHP中創建和使用接口?您如何在PHP中創建和使用接口?Apr 30, 2025 pm 03:40 PM

本文解釋瞭如何創建,實施和使用PHP中的接口,重點關注其對代碼組織和可維護性的好處。

crypt()和password_hash()有什麼區別?crypt()和password_hash()有什麼區別?Apr 30, 2025 pm 03:39 PM

本文討論了PHP中的crypt()和password_hash()的差異,以進行密碼哈希,重點介紹其實施,安全性和對現代Web應用程序的適用性。

如何防止PHP中的跨站點腳本(XSS)?如何防止PHP中的跨站點腳本(XSS)?Apr 30, 2025 pm 03:38 PM

文章討論了通過輸入驗證,輸出編碼以及使用OWASP ESAPI和HTML淨化器之類的工具來防止PHP中的跨站點腳本(XSS)。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

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

SublimeText3 Mac版

SublimeText3 Mac版

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

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。