Php 强制下载tar归档文件的标题

Php 强制下载tar归档文件的标题,php,download,header,tar,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($co

我在服务器上有一个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>

尝试以下方法:

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

当我不得不这样做时,我使用了此代码:

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

试试看。

使用内容类型:应用程序/八位字节流或内容类型:应用程序/x-gtar

不要使用
文件获取内容()
,然后使用
回送
打印
输出文件。将文件的全部内容加载到内存中。大文件可能/将超过脚本的
内存限制
,并终止脚本

为了将文件内容转储到客户端,最好使用-它将正确地过滤文件块,并在不超过可用内存的情况下将其吐出客户端。在执行此操作之前,请记住关闭输出缓冲,否则您实际上只是再次执行
file\u get\u 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”

如果下载后文件仍然损坏,请在客户端执行一些检查:

  • 下载的文件是0字节,但下载过程似乎比传输0字节所需的时间要长得多,这就是客户端阻止下载的原因。病毒扫描器?特洛伊人
  • 下载的文件是否部分存在,但比原始文件小?有些事过早地扼杀了这次转移。过度管理防火墙?下载管理器今天过得不好吗?服务器上的输出缓冲区处于活动状态,最后一个缓冲区未正确刷新
  • 下载的文件是否与原始文件大小相同?对两个副本执行md5/sha1/crc校验和。如果这些都是相同的,那么应用程序打开文件时出错了,而不是文件本身
  • 下载的文件是否比原始文件大?在记事本中打开该文件(或类似记事本++的更好工具,它不需要几年就可以打开大文件),然后查看是否有任何PHP警告消息,或者脚本中看不到的一些不可见空白插入到文件开头或结尾的下载中

  • 确保没有回显任何不是文件输出的内容。在标题之前调用ob_clean()

    使用该函数不是更好吗?同样,但我必须使用DIE。是否可能超过了最大执行时间、post_max_大小或upload_max_文件大小?不,我看不到任何错误在标准文本编辑器中检查下载的文件,并查看文件内容中是否有任何PHP错误消息(例如,已发送的标题)我试过了,但结果是一样的。我认为编码头缺少了一些东西。其他文件下载好吗,例如图像。我现在正在为您进行本地测试。好的,似乎对我有用,我抛出的任何文件:-您如何调用此文件?直接像示例一样有类似问题。转到s out php在文件之前发送了一些额外的数据。我在调用readfile之前添加了对“ob_clean()”的调用,现在它工作了。结果相同。我认为编码头有问题。