Codeigniter - 获取多个文件,重命名然后压缩

时间:2012-01-06 23:35:05

标签: php codeigniter zip

我正在创建一个使用codeigniter的网站,这将使用户能够像gmail一样下载文件。我的意思是用户只能下载zip文件夹中的1个文件或所有文件。

因为会有很多文件,所以我编码了它们的名字以避免重复,并将它们的原始名称存储在一个数据库中,该数据库返回一个如下数组:

Array
(
    [0] => Array
        (
            [file_id] => 2
            [file_name] => v6_copy.pdf
            [file_path] => uploads/4/d5/67697ff58d09d3fb25d563bf85d3f1ac.pdf
        )

    [1] => Array
        (
            [file_id] => 3
            [file_name] => v4_copy.pdf
            [file_path] => uploads/7/cf/38212079635e93a8f8f4d4a3fc2a11ff.pdf
        )

)

我需要做的是,获取每个文件,将它们重命名为原始名称,然后将其压缩成一个拉链。我目前正在尝试使用codeigniter zip帮助程序,但我可以似乎能够重命名文件。

foreach ($query->result() as $row) // This returns what you see above
{
    // I need to rename the file somewhere here
    $this->zip->read_file($row->filename); 
}

$this->zip->download('files_backup.zip');

有没有办法在不手动创建目录,复制文件,重命名文件然后压缩文件的情况下执行此操作?

最值得赞赏的任何帮助。

2 个答案:

答案 0 :(得分:3)

CodeIgniter的Zip类apparently不提供重命名条目的任何方法。您可以使用PHP的本机Zip扩展,它允许您在将文件添加到存档时更改名称(以及稍后)。

来自PHP Manual

的示例
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
    $zip->addFile('/path/to/index.txt', 'newname.txt');
    $zip->close();
    echo 'ok';
} else {
    echo 'failed';
}

答案 1 :(得分:2)

感谢@Gordon的回答,我找到了解决方案。 他对Codeigniter无法重命名文件是完全正确的,但我发现了对库的快速更改,它似乎正在工作。

如果你去@Gordon提到的系统> librairies-> Zip.php,搜索“read_file”,你就会找到该功能。

然后我只是在函数中添加了一个参数,然后修改了一些代码,见下文:

function read_file($path, $preserve_filepath = FALSE, $name = NULL) // Added $name
{
    if ( ! file_exists($path))
    {
        return FALSE;
    }

    if (FALSE !== ($data = file_get_contents($path)))
    {
            if($name == NULL){  // Added a verification to see if it is set, if not set, then it does it's normal thing, if it is set, it uses the defined var.
        $name = str_replace("\\", "/", $path);

        if ($preserve_filepath === FALSE)
        {
            $name = preg_replace("|.*/(.+)|", "\\1", $name);
        }
            }

        $this->add_data($name, $data);
        return TRUE;
    }
    return FALSE;
}

我希望这有助于其他人。再次感谢@Gordon