2014-09-04 191 views
0

我使用的是标准的CI拉链库读取目录,并创建一个zip文件,然而,对于下载,当我在Windows测试此我得到:笨下载的ZIP文件损坏

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'); 
} 
+0

也许这可以帮助:https://ellislab.com/forums/viewthread/111977/ – 2014-09-08 21:49:58

回答

3

据我所知,什么codeigniter's documentation是说:

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

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

    允许您将一个文件夹(及其内容)压缩已经存在某处你的服务器。提供一个到目录的文件路径,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里面,然后正确地存储里面,所有子文件夹,但将不包括的文件夹/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()没有用处。

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Testing extends CI_Controller { 
    public function downloadPackage($unique = '') { 
     $this->load->library('zip'); 

     $unique = '4ts5yegq;'; 
     $text = 'I am zorro ...'; 

     $this->zip->add_data('copy-'.$unique.'.txt', $text); 
     $this->zip->download('dl-'.$unique.'.zip'); 
    } 
} 
+0

嗨,我刚刚尝试过所有这些仍然无法正常工作。 – 2014-09-11 08:17:52

+0

我也试过我给你的例子,并按预期工作。你能说明'$ unique'的价值和$ this-> syndication_m-> getTextForContent()'返回的是什么!? – DaRkSouL 2014-09-11 08:24:52

+0

$ unique = 4ts5yegq;和文本等于一个文本字符串,我已经在这里改变$ text-> synd_text; – 2014-09-11 09:19:24

0

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

除此尝试之外,不要在zip文件中包含空文件夹,有时会造成这类问题。

9

我刚才碰到一个非常类似的问题,即下载的zip文件被损坏了,这就是解决我的问题:

我称之为ob_end_clean()功能只是$this->zip->download()前行。

+0

出色地工作。 ob_end_clean ==“干净/清晰的输出缓冲区” – user1048839 2015-06-08 20:09:38

+0

像一个魅力工作,谢谢.. – Anupam 2016-03-12 10:35:16

+0

完美!谢谢:) – Quentin 2016-08-07 13:48:24