在一個請求中使用 CurlFile 傳送多維資料和多個檔案

假設我們有一個類似下面的表格。我們希望通過 AJAX 將資料傳送到我們的 Web 伺服器,並從那裡傳送到外部伺服器上執行的指令碼。

StackOverflow 文件

所以我們有正常的輸入,一個多選欄位和一個檔案 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 獲取釋出資料和檔案。