PHP强制下载文件 - 要么下载中断,要么系统说无效/损坏文件

时间:2012-02-19 09:01:40

标签: php download

我想要实现的是通过PHP强制下载文件。 我面临着两个问题,我已经开始思考这里可能出现的问题了。

  1. 每当我尝试使用IE下载文件时,下载就会中途中断,即说我的文件大小为1024Kb,当下载停止时大约500Kb,因为我在IE中收到错误消息说“下载已被中断”< / LI>
  2. 我经常遇到的另一个问题(但并非总是如此)是因为某些原因,下载的文件(实际上是一个zip文件)有时会被破坏!服务器上的文件没问题 - 如果我直接从那里下载它,根本没问题。但是,如果我使用我的PHP脚本下载然后尝试解压缩该文件 - Windows说“文件无效或损坏......”
  3. 我真的需要一些帮助。

    以下是下载文件的代码块: -

    $fileName = "./SomeDir/Somefile.zip";
    $fsize = filesize($fileName); 
    set_time_limit(0);
    
    // required for IE, otherwise Content-Disposition may be ignored
    if(ini_get('zlib.output_compression'))
    ini_set('zlib.output_compression', 'Off');
    
    
    // set headers
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header('Content-type: application/zip');
    header("Content-Disposition: attachment; filename=\"".basename($fileName)."\";");
    header("Content-Transfer-Encoding: binary");
    header('Accept-Ranges: bytes');
    header("Content-Length: " . $fsize);
    
    // download
    $file = @fopen($fileName,"rb");
    if ($file) {
      while(!feof($file)) {
    print(fread($file, 1024*8));
    flush();
    if (connection_status()!=0) {
      @fclose($file);
      die();
    }
    }
    @fclose($file);
    }
    

2 个答案:

答案 0 :(得分:1)

试试这个

<?php

$file = "./SomeDir/Somefile.zip";
set_time_limit(0);
$name = "Somefile.zip";

// Print headers and print to output.
header('Cache-Control:');
header('Pragma:');
header("Content-type: application/zip");
header("Content-Length: ". filesize($file));
header("Content-Disposition: attachment; filename=\"{$name}\"");
readfile($file);

?>

答案 1 :(得分:0)

我认为您的内容长度报告的字节数多于实际传输的字节数。 检入服务器的日志。服务器可以gzip内容,当它关闭连接时,客户端仍在等待剩余的声明字节。