這篇文章主要介紹了PHP實現透過CURL上傳檔案功能,結合實例形式分析了php使用curl檔案上傳操作相關屬性設定與使用技巧,需要的朋友可以參考下
本文實例講述了PHP實作透過CURL上傳檔案功能。分享給大家供大家參考,具體如下:
PHP使用CURL上傳文件只需發送一個POST請求就可以了,在請求中設置某個字段為需要上傳的文件全路徑,並且以"@ "開頭,然後使用CURL把變數以POST方式傳送到伺服器,在服務端即可以從超級全域變數$_FILES中取到對應的上傳檔案資訊。
下面我們以一個例子來展示這個過程。
假設本機有一個文字檔log.txt,其路徑為"/www/test/log.txt",內容如下:
this is a file for test hello PythonTab!
為了把這個檔案上傳給服務端的腳本http://www.php.cn/article.html,我們在本地寫了一個名為curl_file.php的腳本,內容如下:
<?php $url = "http://www.php.cn/article.html"; $post_data = array( "foo" => "bar", //要上传的本地文件地址 "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中。
為了展示服務端收到上述程式碼的檔案上傳請求的邏輯,我們在upload.php中寫了以下程式碼:
<?php echo var_export($_FILES,true); echo file_get_contents($_FILES['upload']['tmp_name']); copy($_FILES['upload']['tmp_name'], "./log_copy.txt"); ?>
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腳本的最後一行就是把臨時檔案複製到我們的目標檔案中。
相關推薦:
php實作透過soap呼叫.Net的WebService asmx檔案的方法
#
以上是PHP實作透過CURL上傳檔案功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!