2011-06-21 45 views
0

我想在我的網站上的窗體上上傳文件,然後將它傳遞給遠程API。PHP cURL:從窗體上傳文件到遠程API?

這是我的PHP:

$fields = array(
    'file'=>$_FILES["mediaupload"], 
    'username'=>urlencode($_POST["username"]), 
    'password'=>urlencode($_POST["password"]), 
    'latitude'=>urlencode($_POST["latitude"]), 
    'longitude'=>urlencode($_POST["longitude"]), 
); 
$fields_string = http_build_query($fields); 
$url = my_url; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url); 
curl_setopt($ch,CURLOPT_POST,count($fields)); 
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$response = curl_exec ($ch); 

在我不斷收到該文件無法正確處理錯誤消息的那一刻。 API期望所有字段都是POST字符串,除了文件,它在二進制文件中所期望的。

我知道這將是艱難的調試這爲你們沒有訪問遠程API,但我做什麼明顯錯誤,或應該這樣工作?

非常感謝。

+0

您的API是否有文檔?他們應該告訴你如何使用cURL – Ibu

+0

不確定,但是在php.ini中是否有設置來啓用curl?檢查phpinfo()以查看它是否啓用。 – Eamorr

回答

5

使用curl上傳文件不能像這樣工作。您需要先使用php的move_uploaded_file本地保存文件,然後獲取文件路徑。在字段添加此,

$fields = array(
    'file'=>"@/path/to/myfile.ext", 
    'username'=>urlencode($_POST["username"]), 
    'password'=>urlencode($_POST["password"]), 
    'latitude'=>urlencode($_POST["latitude"]), 
    'longitude'=>urlencode($_POST["longitude"]), 
); 

此外, 我不知道,如果田陣列需要被轉換成字符串用作postfields。根據手冊,它可以是一個數組()直接。

CURLOPT_POSTFIELDS在HTTP「POST」操作中將完整數據發送到 。若要 發佈文件,請在文件名前添加@ 並使用完整路徑。文件類型 可以通過 以類型 的格式爲'; type = mimetype'的文件名明確指定。此 參數可以作爲 urlencoded的字符串等 「PARA1 = VAL1 & PARA2 = val2的& ...」或傳遞作爲 陣列與現場名作爲值作爲密鑰和 場數據。如果值是 數組,則Content-Type標頭將設置爲 ,設置爲multipart/form-data。從PHP 5.2.0開始,通過@前綴傳遞給此選項的文件必須以 數組的形式工作。

+1

爲了讓你的例子適用於OP的情況,你需要''file'=>'@'。 $ _FILES ['mediaupload'] ['tmp_name']',將CURL指向放置在其服務器上的臨時文件。 –

+0

非常有幫助,我只是想發表類似的問題。因此,我可以使用臨時路徑並同時指定一個mime類型(如在'file'=>'@'中。$ _ FILES ['mediaupload'] ['tmp_name']。'; type ='。$ _ FILES ['mediaupload'] ['type'];? – Vasea