2010-08-04 64 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警告消息,或者你的脚本中看不到的一些看不见的空白在开始时插入下载或文件的结尾。