在php中下载zip和exe.遵循了指导方针,得到了奇怪的结果


Downloading zip and exe in php. Followed guidelines, getting weird result

我知道这方面有很多线程,但我在这里遇到了特殊的问题

首先,我试图输出一个zip文件以供下载。我有以下代码

        $file = '/home/www/public/'.$filename;
        header('Content-Type: application/zip');
        header("Content-Transfer-Encoding: Binary");
        header('Content-disposition: attachment; filename='.$filename.'');
        header('Content-Length: '.filesize($file));
        echo readfile($file);

问题是,使用这些标头下载的zip已损坏。无法打开(存档意外结束)。当我删除Content-length标头时,它并没有损坏,但用户无法看到下载时间。

我还想将相同的代码用于exe文件(只是将类型更改为application/octet流),但我得到了相同的结果。文件本身当然很好。就在下载过程中,出现了问题

感谢的任何帮助

下面是我正在使用的实际代码(在已经建议了两次更改之后)。我为stackoverflow简化了它,但也许中有什么东西

        $id = post('file');
        $object = Software_Files_Model::create()->find($id);
        if ($object->software) {    
           $file = '/home/www/public'.$object->software->getPath();
           $size=$object->software->size;
           header('Content-Type: application/zip');
           header("Content-Transfer-Encoding: Binary");
           header('Content-Disposition: attachment; filename='.$object->software->name.'');
           header('Content-Length: '.$size);
           readfile($file);
           exit;
        }

只是再次添加,文件下载作为一个整体。如果它的重量为10兆欧,那么所有10兆欧都可以下载,并保留文件名和所有文件名。我甚至可以打开zip档案并查看内容。在uzipping期间,当消息出现时

您只在filesize()上使用$filename,而不是在第1行的$file中定义的完整路径。