[PHP] PHP + CURL 傳送 Request (GET,POST或上傳檔案) 至另一個網頁

PHP傳送GET、POST、上傳檔案至另一個網址,以及PHP如何接收及處理上傳的檔案。正常來講PHP程式通常是接收端,但有些時候也會扮演傳送端,把資料送到同一個或另一個伺服器,或者讀取某個網頁資料,這時可以用fopen、fsockopen或者cURL,後者功能強大且使用起來很便利、程式碼也很美觀直覺,相當推薦使用。


簡易的使用語法(GET):
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://SomeDomain/SamplePath?SomeVar=test");
curl_exec($ch);
curl_close($ch);

簡單的POST範例:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://SomeDomain/SamplePath");
curl_setopt($ch, CURLOPT_POST, true); // 啟用POST
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query( array( "a"=>"123", "b"=>"321") ));
curl_exec($ch); curl_close($ch);

CURLOPT_POSTFIELDS參數即為POST的內容,而 http_build_query() 效果是將array併成 a=123&b=321 型式的字串,POST內容會在header中標示以application/x-www-form-urlencoded型式傳送,如果不用字串而直接給array也可以,傳送方式則會變成multipart/form-data,但是封包會變大,且可能不被某些Server接受,通常是傳送檔案時才用。

進階的POST範例,參數設置還可以用array的方式取代:
$toURL = "http://SomeDomain/SamplePath?SomeVar=XX";
$post = array(  "a"=>"123",  "b"=>"321",);
$ch = curl_init();
$options = array(  CURLOPT_URL=>$toURL,  CURLOPT_HEADER=>0,  CURLOPT_VERBOSE=>0,  CURLOPT_RETURNTRANSFER=>true,  CURLOPT_USERAGENT=>"Mozilla/4.0 (compatible;)",  CURLOPT_POST=>true,  CURLOPT_POSTFIELDS=>http_build_query($post),);
curl_setopt_array($ch, $options);
// CURLOPT_RETURNTRANSFER=true 會傳回網頁回應,
// false 時只回傳成功與否
$result = curl_exec($ch);
curl_close($ch);
echo $result;


如果要挾帶檔案,和一般的POST動作一樣,只需注意二點:
1.以multipart/form-data模式傳送
2.array內容前面加個@符號,後面接檔案的「絕對路徑」
cURL會自動去讀檔和計算大小,相當方便!

POST檔案範例:
$toURL = "http://SomeDomain/SamplePath?SomeVar=XX";
$post = array(
      "a"=>"123",
      "userfile"=>"@C:/XXX/OOO/oxox.doc"
       //檔案若和程式在同一目錄或相對目錄, 可以用getcwd(), 如:
      // "userfile"=>"@".getcwd()."/oxox.doc",
      // 另外還可以在檔名後面加上分號指定mimetype(較新版的PHP才能使用)
      // (預設的 mimetype 為application/octet-stream)
      // "userfile"=>"@".getcwd()."\\somePic.png;type=image/png"
);
$ch = curl_init();
$options = array(
      CURLOPT_URL=>$toURL,
      CURLOPT_POST=>true,
      CURLOPT_POSTFIELDS=>$post,
      // 直接給array
);
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);

想挾帶多個檔案也可以,只要在array中增加即可。上段程式碼等同於在如下的HTML form中送出資料:
<form action="http://SomeDomain/SamplePath?SomeVar=XX" method="post" enctype="multipart/form-data">
<input type="file" name="userfile" id="userfile" />
<input type="hidden" name="a" value="123" />
<input type="submit" name="submit" value="Submit" />
</form>


因為是HTML標準所以接收端不限於PHP,任何語言都可以,若接收端為PHP時,一樣是處理$_FILES變數,例如下面的程式碼:
if ($_FILES["userfile"]["error"] > 0)
{
   echo "Error: ".$_FILES["userfile"]["error"]."<br />";
}
else
{
   echo "檔名: ".$_FILES["userfile"]["name"]."<br />";
   echo "Type: ".$_FILES["userfile"]["type"]."<br />";
   echo "Size: ".($_FILES["userfile"]["size"]/1024)." Kb<br/>";
   echo "暫存位置: ".$_FILES["userfile"]["tmp_name"];
}


有任何疑問歡迎留言

By 艾摩杰~

留言

這個網誌中的熱門文章

Synology NAS + PXE 掛載iSCSI 打造無硬碟系統 啟動WinXP,Win7

[PS3] PS3 最完整 改機 破解 自製固件 教學 (傻瓜教學版) (韌體Rogero_CEX_4.30_v2.05)

[NodeJS] Synology NAS 架設 NodeJS Server , 並用 forever 背景執行程式