【问题标题】:Codeigniter ZIP file download corruptedCodeigniter ZIP 文件下载损坏
【发布时间】:2022-03-15 18:53:30
【问题描述】:

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

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

【问题讨论】:

标签: php codeigniter zip


【解决方案1】:

我刚刚遇到了一个非常相似的问题,下载的 zip 文件损坏了,这就是解决我的问题的方法:

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

【讨论】:

  • 工作出色。 ob_end_clean == "清理/清除输出缓冲区"
  • 这只发生在我创建大 ZIP 文件(超过 250 个文件,50MB)时,使用 ob_end_clean() 解决了这个问题。谢谢彼得!
【解决方案2】:

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

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

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

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

基本上,您正在创建一个包含从 /var 开始并以 $unique 文件夹中的文件结尾的所有内容的 zip,这肯定会出错...

我建议将第二个参数设置为 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)

    这将创建一个 ZIP,其中包含文件夹“$unique”,然后所有子文件夹都正确存储在其中,但不会包含文件夹 /var/www/html/uploads。 em>

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

  • $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 目录中的任何文件添加到zip 中,否则$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');
    }
}

【讨论】:

  • 嗨,我刚刚尝试了所有这些,但仍然无法正常工作。
  • 我也尝试了我给你的例子并按预期工作。你能告诉我$unique 的值是什么,$this-&gt;syndication_m-&gt;getTextForContent() 返回的是什么!?
  • $unique = 4ts5yegq;并且文本等于一串文本我在这里对 $text->synd_text; 进行了更改
  • 根据您的回答用新的 sn-p 更新了我的问题
  • 请在我的编辑中尝试该功能,只需复制/粘贴,如果它工作正常,请告诉我...
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    我有类似的问题。每当我创建新的 zip 文件并解压缩 .zip 文件时,新文件都会创建为 .cpgz。这是因为我的 zip 文件没有正确创建。意味着它被创建为损坏的 zip 文件。

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

    我解决了以下错误

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

    添加到 index.php 中

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

    【讨论】:

      【解决方案5】:

      使用 ob_end_clean() 函数删除最顶层的输出缓冲区及其所有内容。添加 ob_end_clean(); db 下载函数调用之前的函数。

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。
      猜你喜欢
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多