2017-07-11 98 views
0

我試圖發送一個POST請求到一個API和該請求的一部分我添加一個CSV文件來獲取基於我提供的電子郵件和數字的回報標記。前幾行代碼使用從我的數據庫中檢索的數據,並且生成文件並使用文本數據填充它是正確的。問題在於我的cURL。當我在PostMan中發出這個請求時,結果非常好,我實際上使用PostMan的PHP-curl生成的代碼來編寫這個請求。然而,該行沒有在cURL POST中正確傳遞CSV文件在PHP

filename=\"".$filename."\"\r\n 

不,出於某種原因,造就剛正確之前填充文件和API日誌說,文件中沒有任何數據。這兩個文件都位於同一個目錄中,所以我真的對不正確的操作感到不知所措。

$file = fopen($filename, "w"); 

while ($row2 = mysqli_fetch_array($query2)){ 
    $txt = "$row2[email], $row2[firstname], $row2[lastname], 
    $row[company], $row2[mobilephone]\n"; 
    echo $txt; 
    fwrite($file, $txt); 
} 

$curl = curl_init(); 

echo $filename."\n"; 

curl_setopt_array($curl, array(
    CURLOPT_URL => "https://example.com", 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_ENCODING => "", 
    CURLOPT_MAXREDIRS => 10, 
    CURLOPT_TIMEOUT => 30, 
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, 
    CURLOPT_CUSTOMREQUEST => "POST", 
    CURLOPT_POSTFIELDS => "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\n 
     Content-Disposition: form-data; 
     name=\"token\"\r\n\r\12345\r\n 
     ------WebKitFormBoundary7MA4YWxkTrZu0gW\r\n 
     Content-Disposition: form-data; name=\"datafile\"; 
     filename=\"".$filename."\"\r\n 
     Content-Type: text/csv\r\n\r\n\r\n 
     ------WebKitFormBoundary7MA4YWxkTrZu0gW--", 
    CURLOPT_HTTPHEADER => array(
     "cache-control: no-cache", 
     "content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" 
    ), 
)); 

$response = curl_exec($curl); 
$err = curl_error($curl); 

if ($err) { 
    echo "cURL Error #:" . $err; 
} else { 
    echo $response; 
} 

任何人都可以發現我在這裏做的不正確嗎?

注:我已經取代多個領域,並與隱私/安全原因,僞數據串

+0

你傳遞字符串而不是數組或json的任何原因? – Kisaragi

+0

我簡單地使用Postman在其應用程序中成功創建調用後使用PHP-curl生成的代碼 – Jodo1992

回答

1

我想不出任何(理智)的原因做multipart/form-data手動 - 編碼,當它的瑣碎,使捲曲爲您編碼。那整個curl_setopt_array可以

curl_setopt_array ($curl, array (
     CURLOPT_URL => "https://example.com", 
     CURLOPT_RETURNTRANSFER => true, 
     CURLOPT_ENCODING => "", 
     CURLOPT_MAXREDIRS => 10, 
     CURLOPT_TIMEOUT => 30, 
     CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, 
     CURLOPT_POST=>true, 
     CURLOPT_POSTFIELDS => array (
       'token' => '12345', 
       'datafile' => new CURLFile ($filename, 'text/csv', 'datafile') 
     ), 
     CURLOPT_HTTPHEADER => array (
       "cache-control: no-cache" 
     ) 
)); 
  • 和捲曲更換會做的multipart/form-data編碼爲您服務。
1

API日誌說,該文件中有

之所以沒有數據是你說你會發送「filename.txt」在你的查詢中,但實際上並沒有發送數據。

例如,如果您有||test||內容與POST發送查詢filename.txt,結果查詢將是這樣的:

------WebKitFormBoundaryWJ0Ly0MV6I2Kvqwe 
Content-Disposition: form-data; name="token" 

12345 
------WebKitFormBoundaryWJ0Ly0MV6I2Kvqwe 
Content-Disposition: form-data; name="datafile"; filename="filename.txt" 
Content-Type: text/plain 

||test|| 
------WebKitFormBoundaryWJ0Ly0MV6I2Kvqwe-- 

正如你看到的,該文件的內容應該添加到查詢。在您的查詢,只有聲明,與$filename名文件將被髮送,其內容將在後面,但沒有內容可言:

------WebKitFormBoundary7MA4YWxkTrZu0gW\r\n 
     Content-Disposition: form-data; name=\"datafile\"; 
     filename=\"".$filename."\"\r\n 
     Content-Type: text/csv\r\n\r\n\r\n 

那麼服務器會回答這個文件是空的。

如果你想發送文件,你可以稍後添加內容(如在我的例子中),但這是不好的方法。根據您應該使用其他技術來發送文件數據。無論使用哪種路徑發送帶有可變filename陣列與@爲前綴的文件,或者使用CURLFile(如here

+0

它以表單數據的形式發送,而不僅僅是純文件。這就是郵遞員以這種方式產生它的原因。問題是,當預先填充API時,'$ filename'會顯示爲空白 – Jodo1992

+0

瞭解並更新我的答案。 – SeRRgIO

+0

徹底的解釋。我不知道數據必須分別通知服務器 – Jodo1992