Codeigniter ZIP文件下载已损坏

时间:2014-09-04 10:57:58

标签: php codeigniter zip

我使用标准CI zip库来读取目录并创建一个zip文件以供下载但是当我在Windows中测试时,我得到:

Windows Error

在OS X中,zip解压缩一个cpgz文件,然后解压缩到一个zip文件 - 无限

我的CI功能:

public function downloadPackage($unique) {
    $this->load->library('zip');
    $text = $this->syndication_m->getTextForContent($unique);

    $path = '/var/www/html/uploads/'.$unique.'/';

    if(file_exists($path."copy-".$unique.".txt")) {
        unlink($path."copy-".$unique.".txt");
        $fp = fopen($path."copy-".$unique.".txt","wb");
        fwrite($fp,$text);
        fclose($fp);
    }

    $this->zip->read_dir($path);
    $this->zip->download('dl-'.$unique.'.zip');
}

任何人都可以帮我修复或建议在这做什么?感谢

修改

public function downloadPackage($unique) {
    $this->load->library('zip');
    $path = '/var/www/html/uploads/'.$unique.'/';

    $text = $this->syndication_m->getTextForContent($unique);
    $this->zip->read_dir($path, TRUE);
    $this->zip->add_data('copy-'.$unique.'.txt', $text->synd_text);
    $this->zip->download('dl-'.$unique.'.zip');
}

4 个答案:

答案 0 :(得分:10)

我刚刚遇到一个非常类似的问题,其中下载的zip文件已损坏,这就解决了我的问题:

我在ob_end_clean()行之前调用$this->zip->download()函数。

答案 1 :(得分:3)

据我所知和codeigniter's documentation说的话:

$path = '/var/www/html/uploads/'.$unique.'/';

  • <强> $this->zip->read_dir($path)

    允许您压缩服务器上某处已存在的文件夹(及其内容)。提供目录的文件路径,zip类将递归读取它并将其重新创建为Zip存档。 所提供路径中包含的所有文件将被编码,其中包含的任何子文件夹

基本上你创建了一个zip,其中包含从/var开始到$unique文件夹中的文件结尾的所有内容,这肯定是错误的......

我建议将第二个参数设置为false,因为文档指定:

If you want the tree preceding the target folder to be ignored you can pass FALSE (boolean) in the second parameter.

  • <强> $this->zip->read_dir($path, FALSE)

    这将创建一个内置文件夹“$unique”的ZIP,然后在其中正确存储所有子文件夹,但将不包含文件夹{{1} }。

我还建议/建议,为了更好地控制数据,我相信更少的资源,使用:

  • /var/www/html/uploads代替$this->zip->add_data()fopen()

示例:

$this->zip->read_dir()

注意不要在您调用此函数的控制器中显示任何数据,因为它会发送导致下载发生的各种服务器标头,并将文件视为二进制文件。

---------------编辑---------------

除非您想在public function downloadPackage($unique) { $this->load->library('zip'); $text = $this->syndication_m->getTextForContent($unique); $this->zip->add_data('copy-'.$unique.'.txt', $text); $this->zip->download('dl-'.$unique.'.zip'); } 目录中添加任何文件,否则$unuqie无效。

$this->zip->read_dir()

答案 2 :(得分:0)

使用fopen代替写文件尝试使用“$ this-&gt; zip-&gt; add_data($ text);”并确保指向的目录(子目录)$ path没有任何软链接(快捷方式)文件。

除此尝试外,不要在zip文件中包含空文件夹,有时会产生这些问题。

答案 3 :(得分:0)

我有类似的问题。每当我创建新的zip文件并解压缩 .zip 文件时,新文件就会创建为 .cpgz 。这是由于我的zip文件无法正确创建而发生的。意味着它创建了损坏的zip文件。

同时我得到致命错误:允许的内存大小为134217728字节耗尽(试图分配262144字节)错误。一旦我解决了这个胎儿错误,我的zip和解压缩问题就解决了。

我解决了以下错误

  

致命错误:允许的内存大小为134217728字节耗尽(尝试过   分配262144字节)

添加到index.php

  

ini_set('memory_limit',' - 1');