2016-02-19 46 views
0

我在兩個服務器之間使用curl進行通信。我們已經正確地爲POST和多維數組工作,但它不適用於文件。我們得到了它的文件工作,但它不適用於多維數組。這兩種方式正在使用,PHP curl,文件和1-d/n-d發佈數據不起作用

$post = $_POST; 

//get files and include in data 
foreach($_FILES as $name=>$info) 
{ 
    if(strlen($info['tmp_name'])) 
    { 
     $post[$name] = "@{$info['tmp_name']};filename={$info['name']};type={$info['type']}"; 
    } 
} 

//$post = http_build_query($_POST); //works for multi-dimensional arrays (not files) and not doing this works for files and 1-d data 

//use curl to pass information 
curl_setopt($ch, CURLOPT_POST, true);                
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); //string vs array          

//test on recieving end 
die(print_r($_POST, true) . print_r($_FILES,true)); 

有沒有辦法處理文件和單/多維數據?

回答

0

你可以嘗試將文件放在base64中,這樣它就變成了一個字符串而不是二進制數據。

0

跑了幾次測試,並看到有關PHP網站的信息,有人評論它如何不適用於(PHP,Apache,捲曲)。這個解決方案展示了一個具有硬編碼結果的特定示例來滿足他們的需求,但是我將這個概念擴展爲更通用,並處理單個d,多個d和文件數據。

//encode function found online for specific CURL use (on curl side) 
    function _encode($arrays, &$new = array(), $prefix = null) 
    { 
     if (is_object($arrays)) 
     { 
      $arrays = get_object_vars($arrays); 
     } 

     foreach ($arrays as $key => $value) { 
      $k = isset($prefix) ? $prefix . '[' . $key . ']' : $key; 
      if (is_array($value) OR is_object($value) ) { 
       $this->_encode($value, $new, $k); 
      } else { 
       $new[$k] = $value; 
      } 
     } 
    } 

//use on curl side 
$post = $_POST; 

//get files and include in data 
foreach($_FILES as $name=>$info) 
{ 
    if(strlen($info['tmp_name'])) 
    { 
     $post[$name] = "@{$info['tmp_name']};filename={$info['name']};type={$info['type']}"; 
    } 
} 

//編碼後一般以覆蓋每個用例(文件,單個d,多d,任何形式的設置沒有硬編碼) $編碼=陣列(); _encode($ post,$ encoded);

//使用curl傳遞信息 curl_setopt($ ch,CURLOPT_POST,true);
curl_setopt($ ch,CURLOPT_POSTFIELDS,$ post); //作爲數組傳遞

//test on recieving end 
die(print_r($_POST, true) . print_r($_FILES,true)); //everything as expected