2010-08-04 79 views
1

我有一個tar檔案在服務器上,必須通過PHP下載。這是我用過的代碼:標題強制下載的tar檔案

$content=file_get_contents($tar); 
header("Content-Type: application/force-download"); 
header("Content-Disposition: attachment; filename=$tar"); 
header("Content-Length: ".strlen($content));  
unlink($name); 
die($content); 

該文件已下載但已損壞,無法打開。我認爲頭文件有問題,因爲服務器上的文件可以毫無問題地打開。你知道我該如何解決這個問題?

UPDATE 我試圖打印的iframe這樣的:

<iframe src="<?php echo $tar?>"></iframe> 

而且下載的作品,所以我敢肯定有什麼東西在頭失蹤。

+0

使用[filesize](http://php.net/manual/en/function.filesize.php)函數不是更好嗎? – 2010-08-04 08:32:14

+0

同樣的結果.... – mck89 2010-08-04 08:34:09

+0

如果你回聲而不是死亡? – 2010-08-04 08:37:28

回答

5

我已經使用這個代碼時,我不得不這樣做:

function _Download($f_location, $f_name){ 
header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Length: ' . filesize($f_location)); 
header('Content-Disposition: attachment; filename=' . basename($f_name)); 
readfile($f_location); 
} 

_Download("../directory/to/tar/raj.tar", "raj.tar"); 
//or 
_Download("/var/www/vhost/domain.com/httpdocs/directory/to/tar/raj.tar", "raj.tar"); 

嘗試。

+0

我試過了,但結果是一樣的..我認爲有些東西缺少編碼頭。 – mck89 2010-08-04 08:44:28

+0

做其他文件下載即可,例如圖像。 我現在正在爲您測試本地 – PHPology 2010-08-04 08:47:54

+0

好吧,它似乎是我的工作,我曾經扔過什麼文件: - | 你是怎麼調用這個文件的?直接像http://localhost/download.php,例如 – PHPology 2010-08-04 08:51:33

1

嘗試類似如下:

$s_filePath = 'somefile.ext'; 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename="'. s_filePath.'"'); 
header('Content-Transfer-Encoding: binary'); 
header('Accept-Ranges: bytes'); 
header('Cache-control: private'); 
header('Pragma: private'); 
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
header("Content-Length: ".filesize($s_filePath)); 

$r_fh = fopen($s_filePath,'r'); 
while(feof($r_fh) === false) { 
    $s_part = fread($r_fh,10240); 
    echo $s_part; 
} 
fclose($r_fh); 
exit(); 
+0

同樣的結果。我認爲編碼頭有問題。 – mck89 2010-08-04 08:45:34

1

使用內容類型:應用程序/八位字節流或內容類型:應用程序/ x-GTAR

4

不要使用file_get_contents()然後echoprint輸出文件。將文件的全部內容加載到內存中。一個大文件可以/會超過你的腳本的memory_limit並殺死腳本。

爲了將文件的內容轉儲到客戶端,最好使用readfile() - 它將正確吸取文件塊並在客戶端吐出,而不會超出可用內存。只要記住你這樣做之前,關閉輸出緩衝,否則你基本上只是在做file_get_contents()再次

所以,你最終這樣的:

$tar = 'somefile.tar'; 
$tar_path = '/the/full/path/to/where/the/file/is' . $tar; 
$size = filesize($tar_path); 

header("Content-Type: application/x-tar"); 
header("Content-Disposition: attachment; filename='".$tar."'"); 
header("Content-Length: $size");  
header("Content-Transfer-Encoding: binary"); 

readfile($tar_path); 

如果你的tar文件實際上是gzip壓縮,然後使用「application/x-gtar」代替。

如果該文件還下載出來後損壞,做在客戶端的一些檢查:

  1. 是下載的文件0字節,但下載過程似乎需要更長的時間比它會採取爲0要傳輸的字節,則客戶端會阻止下載。病毒掃描器?木馬?
  2. 下載的文件部分存在,但比原來小?有些東西過早地阻止了轉移。 Overeager防火牆?下載經理有糟糕的一天?服務器上的輸出緩衝處於活動狀態,而最後一個緩衝區未正確刷新?
  3. 下載的文件與原文件大小相同嗎?在兩個副本上執行md5/sha1/crc校驗和。如果這些是相同的,那麼應用程序打開文件時出現問題,而不是文件本身
  4. 下載的文件是否比原始文件大?在記事本中打開文件(或更好的記事本+ +,這不需要幾年打開大文件),看看是否有任何PHP警告消息,或者你的腳本中看不到的一些看不見的空白在開始時插入下載或文件的結尾。