我有以下代码来推送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页面,它可以很好地处理标题。
答案 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();