Codeigniter Zip目录和下载

时间:2017-09-20 07:51:03

标签: php codeigniter

在压缩目录并尝试使用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

但仍未成功!

1 个答案:

答案 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或同等权限,这样当文件发送到客户端时,它将被删除。

希望这有帮助!