2012-11-30 68 views
0

我想tcp從我的linux php ec2實例到另一臺服務器的圖像。
當我回應的內容fopenfread我可以看到圖像處理,但只有一半
有沒有人知道是什麼造成這個請,謝謝。php fopen fread圖像

$imageURL = 'http://ec2-**-***-**-**.compute-1.amazonaws.com/New_Era_For_NASA_2.jpg'; 
$ch = curl_init($imageURL); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
$data = curl_exec($ch); 
//echo $data; 
curl_close($ch); 
if ($data === false) { 
     die('cURL failed'); 
} 
if (preg_match('/Content-length: (\d+)/', $data, $matches) || preg_match('/Content-Length: (\d+)/', $data, $matches)) { 
     $size = (int)$matches[1]; 
} 

$fileHandle = fopen($imageURL, 'rb'); //r or rb 
$fileData = fread($fileHandle, $size); 
//echo $fileData; 
fclose($fileHandle); 
$data = $fileData; 

header('Content-type: image/jpeg'); 
echo $data; 

enter image description here

+0

如果你只是'fread'直到最後,沒有定義的大小? – deceze

+0

@deceze我得到「無法顯示,因爲它包含錯誤」 –

回答

4

爲什麼要抓取它兩次? Curl可以一步完成這項工作。即

$imageURL = 'http://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Tibia_insulaechorab_transparent.png/320px-Tibia_insulaechorab_transparent.png'; 
$ch = curl_init($imageURL);  

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

$data = curl_exec($ch); 
curl_close($ch); 

if ($data === false) { 
     die('cURL failed'); 
} 

header('Content-Type: image/png'); 
header('Content-Length: ' . curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD)); 
echo $data; 
+1

您可以使用'strlen($ data)'確定文件的真實大小' –

+0

是的,'curl_getinfo'會也可能會更好,因爲在PHP設置中,您可以用'mb_strlen'替換'mb_string extension'來重載PHP的'strlen'函數,而不必返回正確的值 –

0

怎麼樣,如果你使用file_get_contents()而不是fread()。你不需要提供長度,它自己發現它並返回完整的內容。

+0

我得到:無法顯示,因爲它包含錯誤 –

0
$imageURL = 'http://ec2-**-***-**-**.compute-1.amazonaws.com/New_Era_For_NASA_2.jpg'; 
$ch = curl_init($imageURL); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
$data = curl_exec($ch); 
echo $data; 
curl_close($ch); 

就足以

file_get_content($imageURL); 

會工作到0,但要注意memory_limit的的,的fread可能是一個更好的選擇。