代码之家  ›  专栏  ›  技术社区  ›  mck89

强制下载tar存档的头文件

  •  2
  • mck89  · 技术社区  · 14 年前

    我在服务器上有一个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 回复  |  直到 14 年前
        1
  •  7
  •   PHPology    14 年前

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

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

    试试看。

        2
  •  5
  •   Ryan    9 年前

    不要使用 file_get_contents() echo print 输出文件。将文件的全部内容加载到内存中。一个大文件可以/将超过脚本的大小 memory_limit 把剧本删掉。

    要将文件内容转储到客户端,最好使用 readfile() -它会正确地将文件块吐出,并在客户端吐出,而不会超出可用内存。只需记住在关闭输出缓冲之前先关闭输出缓冲,否则基本上就是在执行 文件\u获取\u内容() 再一次

    所以,你最终会发现:

    $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校验和。如果它们是相同的,那么应用程序打开文件时出错了,而不是文件本身
        3
  •  1
  •   Sebs    14 年前

    尝试以下操作:

    $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();
    
        4
  •  1
  •   bcosca    14 年前

    使用内容类型:application/octet stream或内容类型:application/x-gtar

        5
  •  0
  •   user3152459    6 年前

    确保没有回显任何不是文件输出的内容。在标题前调用obèu clean()