在一個請求中使用 CurlFile 傳送多維資料和多個檔案
假設我們有一個類似下面的表格。我們希望通過 AJAX 將資料傳送到我們的 Web 伺服器,並從那裡傳送到外部伺服器上執行的指令碼。
所以我們有正常的輸入,一個多選欄位和一個檔案 dropzone,我們可以上傳多個檔案。
假設 AJAX POST 請求成功,我們在 PHP 站點上獲得以下資料:
// print_r($_POST)
Array
(
[first_name] => John
[last_name] => Doe
[activities] => Array
(
[0] => soccer
[1] => hiking
)
)
並且檔案應該如下所示
// print_r($_FILES)
Array
(
[upload] => Array
(
[name] => Array
(
[0] => my_photo.jpg
[1] => my_life.pdf
)
[type] => Array
(
[0] => image/jpg
[1] => application/pdf
)
[tmp_name] => Array
(
[0] => /tmp/phpW5spji
[1] => /tmp/phpWgnUeY
)
[error] => Array
(
[0] => 0
[1] => 0
)
[size] => Array
(
[0] => 647548
[1] => 643223
)
)
)
到現在為止還挺好。現在我們要使用帶有 CurlFile 類的 cURL 將此資料和檔案傳送到外部伺服器
由於 cURL 只接受一個簡單但不是多維的陣列,我們必須首先展平$ _POST 陣列。
為此,你可以使用此功能,例如 ,它提供以下內容:
// print_r($new_post_array)
Array
(
[first_name] => John
[last_name] => Doe
[activities[0]] => soccer
[activities[1]] => hiking
)
下一步是為上傳的檔案建立 CurlFile 物件。這是通過以下迴圈完成的:
$files = array();
foreach ($_FILES["upload"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$files["upload[$key]"] = curl_file_create(
$_FILES['upload']['tmp_name'][$key],
$_FILES['upload']['type'][$key],
$_FILES['upload']['name'][$key]
);
}
}
curl_file_create 是 CurlFile 類的輔助函式,它建立了 CurlFile 物件。我們使用名為“upload [0]”和“upload [1]”的鍵儲存$ files 陣列中的每個物件。
我們現在必須將 flattened post 陣列和 files 陣列合並並將其儲存為$ data,如下所示:
$data = $new_post_array + $files;
最後一步是傳送 cURL 請求:
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_POST => 1,
CURLOPT_URL => "https://api.externalserver.com/upload.php",
CURLOPT_RETURNTRANSFER => 1,
CURLINFO_HEADER_OUT => 1,
CURLOPT_POSTFIELDS => $data
));
$result = curl_exec($ch);
curl_close ($ch);
由於$ data 現在是一個簡單(平面)陣列,因此 cURL 會自動傳送帶有內容型別的 POST 請求:multipart / form-data
在外部伺服器上的 upload.php 中,你現在可以像往常一樣使用$ _POST 和$ _FILES 獲取釋出資料和檔案。