首頁  >  文章  >  後端開發  >  php透過CURL上傳文件

php透過CURL上傳文件

PHP中文网
PHP中文网原創
2017-02-10 14:20:342347瀏覽

p>PHP使用CURL上傳文件只需發送一個POST請求就可以了,在請求中設置某個字段為需要上傳的文件全路徑,並且以“@”開頭,然後使用CURL把該變量以POST方式發送到伺服器,在服務端即可以從超級全域變數$_FILES中取到對應的上傳檔案資訊。

<br>

下面我們以一個例子來展示這個過程。

<br>

假設本地有一個文字檔案log.txt,其路徑為“/www/test/log.txt”,內容如下:

this is a file for test
hello PythonTab!

為了把這個檔案上傳給服務端的腳本http://www. pythontab.com/upload.php,我們在本地寫了一個名為curl_file.php的腳本,內容如下:

<php?
//要上传的本地文件地址
"upload" = > "@/www/test/log.txt"
);
$ch = curl_init();
curl_setopt($ch , CURLOPT_URL , $url);
curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch , CURLOPT_POST, 1);
curl_setopt($ch , CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
 ?>

curl_file.php的邏輯很簡單,設定POST變數$post_data,其中upload指向需要傳送的檔案。這裡要注意,我們之前使用POST都是傳送字串,然後在伺服器端使用file_get_contents(“php//input”)來取得該字串,和這裡的用法不一樣,其實POST也可以像GET一樣,發送鍵值對。在服務端有一個超級全域變數$_POST可以像$_GET一樣,取得對應的POST資料的值。要注意的是,上傳檔案的變數不是存在著$_POST中,而是在$_FILES中。

<br>

為了展示服務端收到上述程式碼的檔案上傳要求的邏輯,我們在upload.php中寫了以下程式碼:

<br>

upload.php首先使用var_export將$_FILES變數輸出到標準輸出,然後使用file_get_contents讀取$_FILES['upload']['tmp_name']所指檔案的內容,並輸出到標準輸出,然後把$_FILES['upload']['tmp_name']所指檔案自製到目前目錄的log_copy.txt檔案中。這個腳本的標準輸出如下:

array(
 &#39;upload&#39; =>
     array(
     &#39;name&#39; => &#39;log.txt&#39;,
     &#39;type&#39; => &#39;application/octet-stream&#39;,
     &#39;tmp_name&#39; => &#39;/tmp/phpLUB59F&#39;,
     &#39;error&#39; => 0,
     &#39;size&#39; => 36,
     )
 )
 this is a file for test
 hello PythonTab!

可以看到$_FILES變數中有一個upload數組,對應到上傳檔案描述訊息,其中name和type分別表示名稱和類型。 tmp_name比較關鍵,服務端在接收到上傳檔案之後,會把檔案寫在一個暫存檔案中,這個暫存檔案的名字就是tmp_name的值,這也是為什麼我們讀取該檔案可以取得一log.txt的檔案內容。一般在服務端接收到上傳檔案後都需要立即讀取該檔案或把檔案複製到別外一個檔案中,因為tmp_name所指的暫存檔案在服務端腳本執行完畢後會被刪除掉,upload.php腳本的最後一行就是把臨時檔案複製到我們的目標檔案中。

<br>

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