2012-01-06 71 views
3

我正在制作一个网站,使用codeigniter,它将使用户能够像gmail一样下载文件。我的意思是,用户只能下载一个文件或一个zip文件夹中的所有文件。Codeigniter - 获取多个文件,重命名并压缩它

因为会有很多文件,我已编码自己的名字,以避免重复和存储在返回我一个这样的数组数据库原来的名称:

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 
     ) 

) 

我需要做的是,获取每个文件,将它们重命名为它们的原始名称,然后用一个zip压缩。我目前正在尝试使用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'); 

有没有办法做,而无需手动创建一个目录,复制文件,重命名它们,然后荏苒文件?

任何帮助最受赞赏。

回答

1

由于@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; 
} 

我希望这可以帮助别人。再次感谢@戈登

+0

你可能想要发送一个pull请求到git仓库。如果他们接受它,其他人也可以使用这种改变。 – Gordon 2012-01-07 10:51:04

+0

什么是拉请求? – denislexic 2012-01-07 16:21:22

+1

见http://help.github.com/send-pull-requests/请 – Gordon 2012-01-07 16:44:33

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

很酷,这很有趣。谢谢你的答案@戈登。它是否也将其存储在像Codeigniter这样的临时文件中?我的意思是,一旦它被卸载了,它会自动删除吗? – denislexic 2012-01-07 02:00:22

+0

@denislexic不确定tbh。我认为它被写入磁盘。 – Gordon 2012-01-07 10:51:50

相关问题