2012-09-14 83 views
2

我試圖使用捲曲和PUT方法上載文件時,我已經是作品使用fsockopen功能,但我想它遷移到捲曲。PUT文件(內容)與PHP和捲曲

使用的fsockopen接收文件的內容,文件名和身份驗證憑據,併發出請求的功能:

function put_file($content, $filename, $username, $pass) 
{ 
    $header = "PUT /upload?username=".urlencode(user_name)."&passwd=".urlencode($pass)."&filename=".urlencode($file_name)." HTTP/1.0\r\n"; 
    $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
    $header .= "Content-Length: " . strlen($content) . "\r\n\r\n"; 
    $fp = @fsockopen("ssl://URL", 443, $errno, $errstr, 30); 
    if(!$fp) 
    { 
     return "ERROR"; 
    } 
    else 
    { 
     fputs ($fp, $header.$content); 
     while (!feof($fp)) 
     { 
      $res .= fread ($fp, 1024); 
     } 
     fclose($fp); 
    } 
} 

我一直在嘗試遷移的功能捲曲,但我不」我知道如何去做,而不需要在我的文件系統上有一個「真正的」文件。我知道這樣做的唯一的捲曲選項CURLOPT_INFILE和CURLOPT_INFILESIZE,但我沒有該文件(並不願意將其寫入到磁盤後打開它)。

我需要的是發送文件的「內容」,就像的fsockopen版本一樣。這怎麼能用cURL來實現?

謝謝你在先進。

+0

我們可能知道遷移到cURL的目的嗎? – Raptor

+0

@ShivanRaptor我所有的應用程序都使用cURL,我想保持思維的統一。這是不是很麻煩,或者你認爲在這種情況下最好不要使用cURL? – SubniC

回答

1

你可以使用php://temp包裝,這是在PHP臨時文件流。建立捲曲時

$fp = fopen("php://temp", "r+"); 
fputs($fp, $content); 
rewind($fp); 

然後只需使用:

首先,你寫數據到流中(不要忘記使用rewind()所以捲曲將讀取所有數據)

curl_setopt($ch, CURLOPT_INFILE, $fp); 
curl_setopt($ch, CURLOPT_INFILESIZE, strlen($content)); #adding missing bracket 

並在最後臨時文件處理程序(可選):

fclose($fp); 
+0

感謝您的回答,其實我在尋找的做沒有創建一個臨時文件的方式,只是我有內容。那可能嗎? – SubniC

+0

在PHP://溫度包裝器將實際上它的數據存儲在存儲器中,除非該數據擊中預定極限。據我所知,沒有辦法使用cURL在PUT請求中使用變量內容。我可以知道你不想使用臨時文件的原因嗎?我假設你不會發送大文件,因爲你將數據傳遞給函數中的一個變量。 –