我试图通过在本地服务器上创建zip文件来下载2个文件。该文件以zip格式下载但是当我尝试提取它时。它给出了错误: 找不到中心目录结尾签名。这个文件不是 一个zip文件,或者它构成一个多部分存档的磁盘。在里面 后一种情况,中心目录和zip文件注释将被找到 该档案的最后一个磁盘。
我正在使用以下代码:
<?php
$file_names = array('iMUST Operating Manual V1.3a.pdf','iMUST Product Information Sheet.pdf');
//Archive name
$archive_file_name=$name.'iMUST_Products.zip';
//Download Files path
$file_path=$_SERVER['DOCUMENT_ROOT'].'/Harshal/files/';
zipFilesAndDownload($file_names,$archive_file_name,$file_path);
function zipFilesAndDownload($file_names,$archive_file_name,$file_path)
{
//echo $file_path;die;
$zip = new ZipArchive();
//create the file and throw the error if unsuccessful
if ($zip->open($archive_file_name, ZIPARCHIVE::CREATE )!==TRUE) {
exit("cannot open <$archive_file_name>\n");
}
//add each files of $file_name array to archive
foreach($file_names as $files)
{
$zip->addFile($file_path.$files,$files);
//echo $file_path.$files,$files."
}
$zip->close();
//then send the headers to force download the zip file
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=$archive_file_name");
header("Pragma: no-cache");
header("Expires: 0");
readfile("$archive_file_name");
exit;
}
?>
我检查了传入函数的所有变量的值,一切都很好。所以请看一下。谢谢。
答案 0 :(得分:35)
添加Content-length
标题,描述zip文件的大小,以字节为单位。
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=$archive_file_name");
header("Content-length: " . filesize($archive_file_name));
header("Pragma: no-cache");
header("Expires: 0");
readfile("$archive_file_name");
同时确保<?
之前和?>
之后绝对没有空格。我在这里看到一个空间:
↓
<?php
$file_names = array('iMUST Operating Manual V1.3a.pdf','iMUST Product Information Sheet.pdf');
答案 1 :(得分:6)
// http headers for zip downloads
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/octet-stream");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filepath.$filename));
ob_end_flush();
@readfile($filepath.$filename);
我发现了这个问题here,它对我有用
答案 2 :(得分:5)
$zip = new ZipArchive;
$tmp_file = 'assets/myzip.zip';
if ($zip->open($tmp_file, ZipArchive::CREATE)) {
$zip->addFile('folder/bootstrap.js', 'bootstrap.js');
$zip->addFile('folder/bootstrap.min.js', 'bootstrap.min.js');
$zip->close();
echo 'Archive created!';
header('Content-disposition: attachment; filename=files.zip');
header('Content-type: application/zip');
readfile($tmp_file);
} else {
echo 'Failed!';
}
答案 3 :(得分:2)
我刚遇到这个问题。对我来说问题是:
readfile("$archive_file_name");
导致内存不足错误。
Allowed memory size of 134217728 bytes exhausted (tried to allocate 292982784 bytes)
我能够通过将readfile()替换为以下内容来解决问题:
$handle = fopen($zipPath, "rb");
while (!feof($handle)){
echo fread($handle, 8192);
}
fclose($handle);
不确定这是否是同一个问题或者没有看到您的文件只有1.2 MB。也许这会帮助其他有类似问题的人。
答案 4 :(得分:2)
其中一个错误可能是该文件未被读取为“存档”格式。看看ZipArchive not opening file - Error Code: 19。在文本编辑器中打开下载的文件,如果在启动时有任何html标签或调试语句,请在读取文件之前清除缓冲区。
ob_clean();
flush();
readfile("$archive_file_name");
答案 5 :(得分:1)
我遇到了完全相同的问题。就我而言,它的来源是我想要创建zip文件的文件夹的权限,这些文件都设置为只读。我把它改成了读写,然后才有效。
如果在运行脚本时未在本地服务器上创建文件,则很可能会遇到与我相同的问题。
答案 6 :(得分:0)
但我下载后从服务器获取的文件给出了大小 226字节
这是ZIP标题的大小。显然下载的ZIP文件中没有数据。那么,您是否可以验证要添加到ZIP文件中的文件确实存在(相对于下载PHP脚本的路径)?
考虑在addFile
上添加一项检查:
foreach($file_names as $file)
{
$inputFile = $file_path . $file;
if (!file_exists($inputFile))
trigger_error("The input file $inputFile does not exist", E_USER_ERROR);
if (!is_readable($inputFile))
trigger_error("The input file $inputFile exists, but has wrong permissions or ownership", E_USER_ERROR);
if (!$zip->addFile($inputFile, $file))
trigger_error("Could not add $inputFile to ZIP file", E_USER_ERROR);
}
观察到的行为与某些问题(路径错误,权限问题......)一致,导致文件无法添加到ZIP文件中。在收到“空”ZIP文件时,客户端发出一个错误,指的是缺少ZIP中心目录(实际错误是没有目录,没有文件)。