2009-12-07 94 views
4

我試圖通過流式下載通過我的服務器將文件下載到我。readfile無法正常工作

這是我的腳本:

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename=http://user:[email protected]/file.bin'; 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 
header('Content-Length: ' . $r[2]); 
ob_clean(); 
flush(); 
readfile($fileName); 
exit; 

example.com是不是我真正使用,我只是不想表現出真實的URL。 :)當我在我的網絡瀏覽器中訪問這個文件時,下載提示不出來,什麼也沒有發生。 $r[2]是文件的內容長度(以字節爲單位),$fileName與附件標頭中使用的URL相同。我真的不知道我做錯了什麼。

+1

我不明白背後的服務絕對URL用戶名和密碼推理(?!?!? !)作爲下載文件名。謹慎闡述? – 2009-12-07 18:33:44

+0

@Joseph:標籤不屬於主題 – SilentGhost 2009-12-08 16:57:13

回答

5

readfile();需要機器上文件的絕對路徑而不是url。

例如/home/person/file.exe

+1

嗨,我已經嘗試過這一點,當我用本地文件測試它時腳本仍然不起作用。即使這確實有效,我仍然有打開一個URL與readfile()的問題不是嗎? php.net說這個函數接受一個URL,但我無法讓它工作。謝謝回覆。 – Joseph 2009-12-07 17:55:59

+0

從php函數頁面「如果fopen包裝已啓用,可以使用此URL作爲文件名。有關如何指定文件名的更多詳細信息,請參見fopen()。有關鏈接的支持協議/包裝列表瞭解各種包裝材料具有什麼能力的信息,關於它們的使用情況的註釋以及它們可能提供的任何預定義變量的信息。「 – 2009-12-07 17:56:03

0

在文件頭標題行末尾缺少),但我假設在編輯該行時發生了這種情況。

爲什麼它的價值,運行你的示例代碼給出下載提示,並沒有真正測試過它,但也許它是與服務器/客戶端配置 - 而不是代碼。

0

恕我直言,這個問題是文件大小,嘗試獲得通過HTTP文件大小(看看這個功能): http://codesnippets.joyent.com/posts/show/1214

所以編輯從

header('Content-Length: ' . $r[2]); 

header('Content-Length: ' . get_remote_file_size($fileurl)); 

希望你解決你的問題。

0

我發現了一種下載圖像的方式,但這可以幫助任何類型的文件。它不使用readfile下載文件。

我知道這可能很笨拙,但有時我們需要一些解決方法才能完成工作。

試試這個,在$src = 'http://external-server/remote-image.jpg'

$url_stuff = parse_url($src); 
$port = isset($url_stuff['port']) ? $url_stuff['port'] : 80; 
$fp = fsockopen($url_stuff['host'], $port); 
$query = 'GET ' . $url_stuff['path'] . " HTTP/1.0\n"; 
$query .= 'Host: ' . $url_stuff['host']; 
$query .= "\n\n"; 
$buffer=null; 
fwrite($fp, $query); 
while ($tmp = fread($fp, 1024)) 
{ 
    $buffer .= $tmp; 
} 

preg_match('/Content-Length: ([0-9]+)/', $buffer, $parts); 
header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename=your_file.bin'); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 

$content = substr($buffer, - $parts[1]); 
echo $content; 

,這是測試和工作;-)