2012-06-13 98 views
0

我將大量網站上傳到RapidShare進行存儲。然後我有一個腳本,當用戶想要下載文件時,使用他們的API從RapidShare下載並將其提供給用戶。下面是在提供文件腳本中的相關代碼:從RapidShare下載時損壞的圖像

// Stream file to user 
header('Content-Description: File Transfer'); 
header('Content-Disposition: attachment; filename=' . $result->name); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Content-Length: ' . $result->size); 

$url = 'https://' . $host . '/cgi-bin/rsapi.cgi?sub=download'; 
$url .= '&login=login'; 
$url .= '&password=mypass'; 
$url .= '&fileid=' . $result->rs_fileid; 
$url .= '&filename=' . $result->name; 

$handle = fopen($url, 'rb'); 
if(!$handle) { 
    throw new Exception('Failed to open file handle'); 
} 

while(!feof($handle)) { 
    echo fread($handle, 1024*1024); 
    ob_flush(); 
    flush(); 
} 

fclose($handle); 

能正常工作,所有我除了圖像測試的文件。下載圖像時,它們已損壞。 Windows照片查看器無法打開圖像,也無法像Photoshop一樣編程。奇怪的是,如果我下載一個.exe文件並運行它,一切正常。它不是腐敗的。它只發生在圖像上,據我所知。我也用.pdf來測試它。

爲了讓它更加美觀,如果我查看原始圖像的文件大小(2,882字節),然後通過此腳本下載的圖像的文件大小,它們是相同的。兩者的文件大小是2,882字節。但形象仍然腐敗。

這可能是什麼原因和解決方案?這不像我在下載文件時向文件添加任何二進制數據。 :/

謝謝。

編輯:忘了提及,如果我直接從RapidShare下載文件而不通過腳本,圖像是好的,沒有損壞。所以這一定是錯誤的腳本。

+0

文件的md5sums如何比較?你能否給我們一個原始的例子和被摧毀的? – OmnipotentEntity

回答

1

請檢查我的answer for a similar problem,我很確定您的文件開頭會有一些提示!

+0

就是這樣,謝謝。有了這個在開始:'
注意:使用未定義的常量RESP的 - 在ç假定 'RESP':\ XAMPP \ htdocs中\的download.php上線前
'忘了'$'的變量。 :p –

1

簡化代碼,就沒有必要爲header()東西,file_put/get_contents是非常圓滑:

$url = 'https://' . $host . '/cgi-bin/rsapi.cgi?sub=download'; 
$url .= '&login=login'; 
$url .= '&password=mypass'; 
$url .= '&fileid=' . $result->rs_fileid; 
$url .= '&filename=' . $result->name; 

file_put_contents($result->name, file_get_contents($url)); 

當你有記憶的問題,使用mod_xsendfile,使用方便。

+0

雖然我沒有從RapidShare保存文件。我將它傳送給用戶。頭文件確保用戶瀏覽器識別出它是一個下載文件,然後來自RapidShare的文件以大塊的形式回顯出來。 –

+0

啊,好的!因此,只需使用'echo file_get_contents($ url);'而不是「醜陋的」'fread()'東西。 – powtac

+0

這實際上是我最初做的。不幸的是,'file_get_contents()'將整個文件加載到內存中,然後將其回送到客戶端。我正在提供大量下載(大小隻有幾GB),如果我使用'file_get_contents()',我會將GB文件加載到內存中。因此,我必須使用更容易出錯的方法以塊的形式提供服務,所以我只在內存中擁有該塊。不過謝謝。 :) –