我知道这方面有很多线程,但我在这里遇到了特殊的问题
首先,我试图输出一个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中定义的完整路径。