PHP如何通過CURL上傳文件


PHP使用CURL上傳文件只需發送一個POST請求就可以了,在請求中設置某個字段為需要上傳的文件全路徑,並且以“@”開頭,然后使用CURL把該變量以POST方式發送到服務器,在服務端即可以從超級全局變量$_FILES中取到相應的上傳文件信息。

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

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

this is a file for test
hello PythonTab!
為了把這個文件上傳給服務端的腳本http://bbs.pythontab.com/upload.php,我們在本地寫了一個名為curl_file.php的腳本,內容如下:

 1 <?php
 2 $url = "http://bbs.pythontab.com/upload.php";
 3 $post_data = array(
 4 "foo" => "bar",
 5 //要上傳的本地文件地址
 6 "upload" = > "@/www/test/log.txt"
 7 );
 8 $ch = curl_init();
 9 curl_setopt($ch , CURLOPT_URL , $url);
10 curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1);
11 curl_setopt($ch , CURLOPT_POST, 1);
12 curl_setopt($ch , CURLOPT_POSTFIELDS, $post_data);
13 $output = curl_exec($ch);
14 curl_close($ch);
15 echo $output;
16 ?>


curl_file.php的邏輯很簡單,設置POST變量$post_data,其中upload指向需要發送的文件。這里要注意,我們之前使用POST都是發送一個字符串,然后在服務器端使用file_get_contents(“php//input”)來獲取該字符串,和這里的用法不一樣,其實POST也可以像GET一樣,發送鍵值對。在服務端有一個超級全局變量$_POST可以像$_GET一樣,獲取相應的POST數據的值。需要注意的是,上傳文件的變量不是存在着$_POST中,而是在$_FILES中。

為了展示服務端收到上述代碼的文件上傳請求的邏輯,我們在upload.php中寫了以下代碼:

1 <?php
2 echo var_export($_FILES,true);
3 echo file_get_contents($_FILES['upload']['tmp_name']);
4 copy($_FILES['upload']['tmp_name'], "./log_copy.txt");
5 ?>

 

upload.php首先使用var_export將$_FILES變量輸出到標准輸出,然后使用file_get_contents讀取$_FILES[‘upload’][‘tmp_name’]所指文件的內容,並輸出到標准輸出,然后把$_FILES[‘upload’][‘tmp_name’]所指文件自制到當前目錄的log_copy.txt文件中。該腳本的標准輸出如下:

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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM