在压缩目录并尝试使用codeigniter下载时,我遇到了一个非常奇怪的问题。
这是代码
$this->load->library('zip'); //Loading the zip library
$directory = $_SESSION['directory-download-path']; //Getting the directory from session
$name = basename($directory); //get the name of the folder
$name = str_replace(" ", "_", $name).".zip"; //create the zip name
unset($_SESSION['directory-download-path']); //removing it from session
$this->zip->read_dir($directory); //read the directory
$this->zip->download($name); //download the zip
很简单。下载时会出现此问题。我得到了zip文件,但是当我提取它时,我得到一个.zip.cpgz的文件并继续提取类似的文件。因此,我认为它已被破坏。能帮到我,为什么会这样。我有权限和目录上的所有内容,因为我正在进行其他操作。
编辑:
我在经过一些研究后发现添加第二个参数如下:
$this->zip->read_dir($directory, false); //read the directory
但仍然无法正常工作。 另一个解决方案是添加
ob_end_clean();
就在行前:$this->zip->download($name); //download the zip
但仍未成功!
答案 0 :(得分:0)
由于我没有响应,我在codeigniter之外创建了一个函数,递归地压缩文件和文件夹,如下所示:
public function Zip($source, $destination)
{
if (!extension_loaded('zip') || !file_exists($source)) {
return false;
}
$zip = new ZipArchive();
if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
return false;
}
$source = str_replace('\\', '/', realpath($source));
if (is_dir($source) === true)
{
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
foreach ($files as $file)
{
$file = str_replace('\\', '/', $file);
if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..', "Thumbs.db")) )
continue;
$file = realpath($file);
if (is_dir($file) === true)
{
$zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
}
else if (is_file($file) === true)
{
$zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
}
}
}
else if (is_file($source) === true)
{
$zip->addFromString(basename($source), file_get_contents($source));
}
return $zip->close();
}
在codeigniter控制器之后,我做了这个:
$this->projects->Zip($source, $destination);
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=$name");
header("Content-length: " . filesize($destination));
header("Pragma: no-cache");
header("Expires: 0");
readfile($destination);
unlink($destination);
当然$destination
应该是一个临时文件夹,你有权限777或同等权限,这样当文件发送到客户端时,它将被删除。
希望这有帮助!