2010-04-15 74 views
1

我試圖發送表單域和文件到使用PHP捲曲的Web服務。該表單已經從瀏覽器傳遞到代理PHP客戶端Web應用程序,我試圖將其轉發到Web服務。如何使用PHP Curl發送表單域和文件?

當我傳遞一個數組curl_setopt這樣的:

curl_setopt($this->ch, CURLOPT_POSTFIELDS, $this->fields);

我得到一個數組爲String通知雖然是指把一個數組。這是我的數組傳遞給構造函數中的$ this->字段。

$fields = array('title'=>$title, 
'content'=>$content, 
'category'=>$category, 
'attachment'=>$_FILES['attachment']); 

如果我通過使用http_build_query我的web serivce抱怨沒有多/表單數據的字符串。

如果我再用力使用curl_setopt多部分/表單的enctype我得到一個錯誤說沒有邊界:

org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found

任何想法?

回答

3

數組串注意到你有下面的代碼:

$fields = array(
    'title'=>$title, 
    'content'=>$content, 
    'category'=>$category, 
    'attachment'=>$_FILES['attachment'] 
); 
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $fields); 

是不是因爲你傳遞一個數組作爲第三個參數curl_setopt:那是因爲你傳遞一個數組attachment


如果你想傳遞一個文件這種方式,你應該通過它的絕對路徑,之前預先以待@它:

$fields = array(
    'title'=>$title, 
    'content'=>$content, 
    'category'=>$category, 
    'attachment'=> '@' . $_FILES['attachment'] 
); 
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $fields); 

(這是假設$_FILES['attachment']包含的完整路徑你的文件 - 由你來改變這種代碼,以便它使用正確的數據,如果需要的話)


作爲參考,引用的curl_setopt手冊頁,爲CURLOPT_POSTFIELDS選項:

要在HTTP「POST」操作中發佈的完整數據。
要發佈文件,請在文件前加上@並使用完整路徑。
這可以作爲urlencoded字符串(如'para1=val1&para2=val2&...')傳遞,也可以作爲字段名稱作爲鍵和字段數據作爲值的數組傳遞。
如果value是一個數組,Content-Type標題將被設置爲multipart/form-data

+0

謝謝,我現在正在與@文件名,但我仍然得到多邊界錯誤。 – blank 2010-04-15 11:32:50

0

試試這個,

$filePath = "abc\\xyz.txt";   

$postParams["uploadfile"] = "@" . $filePath; 


     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
     curl_setopt($ch, CURLOPT_URL, 'https://website_address'); 
     curl_setopt($ch, CURLOPT_POST, 1); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $postParams); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     $response = curl_exec($ch); 

     if (curl_errno($ch)) 
      { 
       echo curl_error($ch);    
       exit();       
      } 
     curl_close($ch); 
相關問題