用于强制下载tar存档的标头

时间:2010-08-04 08:26:34

标签: php download header tar

我在服务器上有一个tar存档,必须可以通过php下载。这是我用过的代码:

$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);

文件已下载但文件已损坏且无法打开。我认为标题有问题,因为服务器上的文件可以打开而没有问题。你知道我怎么能解决这个问题呢?

更新 我试图像这样打印一个iframe:

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

下载工作正常,所以我确信标题中缺少一些内容。

5 个答案:

答案 0 :(得分: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");

试试。

答案 1 :(得分:5)

请勿使用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. 下载的文件是否部分存在,但是比原始文件小?有些东西过早地杀死了转移。过度的防火墙?下载经理有糟糕的一天?服务器上的输出缓冲是否处于活动状态,而最后一个缓冲区桶是否未正确刷新?
  3. 下载的文件是否与原始文件大小相同?在两个副本上执行md5 / sha1 / crc校验和。如果这些是相同的,那么打开文件的应用程序出错了,而不是文件本身
  4. 下载的文件是否大于原始文件?在记事本中打开文件(或者更像notepad ++的东西,这不需要花费数年的时间来打开大文件),看看是否有任何PHP警告消息,或者您在脚本中看不到的一些看不见的空白在开始时被插入到下载中或文件的结尾。

答案 2 :(得分: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();

答案 3 :(得分:1)

使用Content-Type:application / octet-stream或Content-Type:application / x-gtar

答案 4 :(得分:0)

确保您没有回显任何不是文件输出的内容。在标题

之前调用ob_clean()