2011-02-23 49 views
1

我正在使用CURL來創建一個轉發多部分表單的PHP代理。
表單有一個輸入類型=「文件」。

代理收到以下數據:

array 
    'foo' => 
    array 
     'name' => string 'wt.jpg' (length=6) 
     'type' => string 'image/jpeg' (length=10) 
     'tmp_name' => string '/tmp/phpoIvraK' (length=14) 
     'error' => int 0 
     'size' => int 7427 

所以我期待網頁在年底接收相同的陣列(除tmp_name的值) 現在我收到此:

'foo' => 
    array 
    'name' => 'phpoIvraK' 
    'type' => 'image/jpeg' 
    'tmp_name' => '/tmp/php5ZhCwy' 
    'error' => 0 
    'size' => 7427 

正如您所見,名稱現在是代理正在接收的tmp_name,因此原始文件名會丟失。

這裏的PHP代碼:

$arrFields = $_POST; 
foreach($_FILES as $k => $file) 
    $arrFields[$k] = '@' . $file['tmp_name'] . ';type=' . $file['type']; 

curl_setopt($ressource, CURLOPT_POSTFIELDS, $arrFields); 

詩:我知道我可以做一個新的變量,但這裏的目標是要尊重可變格式,使代理的使用盡可能透明爲將使用它的人。

難道是我還是唯一的解決方案是在重新發送之前重命名/ tmp中的tmp文件?這看起來有點傻,我...

$arrFields = $_POST; 
foreach($_FILES as $k => $file){ 
    move_uploaded_file($file['tmp_name'], $file['name']); 
    $arrFields[$k] = '@' . $file['name'] . ';type=' . $file['type']; 
} 
curl_setopt($ressource, CURLOPT_POSTFIELDS, $arrFields); 

回答

0

我想你不應該使用的tmp文件,而是將文件存儲與它的真名的地方,把它傳遞給POSTFIELDS PARAM並執行刪除後。這似乎是對我來說最簡單的方法。 curl並不關心原始請求,它只是做你告訴它做的事情,那就是......發送臨時文件。

+0

好te點是它是一個代理。在執行時,我在$ _FILES數組之前完成了嚴格的處理。 因此,基本上,您確認我應該將tmp_name中的tmp文件夾中的所有文件重命名爲名稱? – FMaz008 2011-02-23 21:43:30

+0

嗯,是的,直到你實際上用tmp_uploaded_file從tmp文件夾中移動文件,這個文件實際上就是它所說的那樣...一個臨時文件,在$ _FILES數組中有真實名稱。 – ChrisR 2011-02-23 21:46:27

+0

那麼,在你看來,最好的辦法就是像我最後一個問題的最後一個例子那樣做? – FMaz008 2011-02-23 21:54:01

0

面對類似的情況,這是我如何解決它

通過實際的文件名與請求

$arrInputs["uploadvia"]  = 'curl'; 
$arrInputs["actualfilename"]= $_FILES["upfile1"]["name"]; 
$arrInputs["upfile1"]  = "@".$_FILES["upfile1"]["tmp_name"].";type=".$_FILES["upfile1"]["type"].";"; 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $arrInputs); 

沿着而在另一端,把該塊

if($_POST['uploadvia'] == "curl") 
{ 
    $_FILES["upfile1"]["name"] = $_REQUEST['actualfilename']; 
}