PHP:强制下载不起作用

时间:2012-06-29 17:25:59

标签: php

我有以下代码来推送zip文件供下载。

$filename = "ResourcePack_".time().".zip";
        $destination = $basepath."downloads/$filename";
        if($this->createdownload($files,$destination,false)){
            header("Cache-Control: public");
            header("Content-Description: File Transfer");
            header("Content-Length: ". filesize("$destination").";");
            header("Content-Disposition: attachment; filename='$filename'");
            header("Content-Type: application/octet-stream; "); 
            header("Content-Transfer-Encoding: binary");
            ob_end_flush();
            @readfile($destination);

            if(file_exists($destination)){
                unlink($destination);
            }
        }

我知道createdownload函数正在生成zip文件,因为我看到正在服务器上创建的文件。问题是文件被写成一堆垃圾而不是打开下载流。我错过了标题中的内容吗?

修改

我是对的。我的问题不在于php,而是调用通过JQuery $ .ajax调用生成此代码的php文件是问题所在。使用$ .ajax会自动将Accept-Encoding请求标头设置为与zip文件不兼容的值。因此,使用$ .ajax我只是使用一个简单的window.open javascript命令来调用相同的php页面,它可以很好地处理标题。

2 个答案:

答案 0 :(得分:0)

尝试为该文件传递正确的类型。我认为它的fileinfo mime类型见http://www.php.net/manual/en/ref.fileinfo.php

header("Content-Type: $file_type");

在octet-stream删除后你也有分号

header("Content-type: application/octet-stream");

答案 1 :(得分:0)

尝试在@readfile之后放一个骰子 并删除@,以查看是否有与文件读取相关的任何其他错误。

我有一些代码做同样的事情,这对我有用:

        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private", false); // required for certain browsers
        header('Content-Disposition: inline; filename="' . $filename . '"');
        header('Content-type: application/zip');
        //header("Content-Transfer-Encoding: binary");
        header("Content-Length: " . filesize($destination));

        readfile($destination);
        die();