我正在创建一个使用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');
有没有办法在不手动创建目录,复制文件,重命名文件然后压缩文件的情况下执行此操作?
最值得赞赏的任何帮助。
答案 0 :(得分:3)
CodeIgniter的Zip类apparently不提供重命名条目的任何方法。您可以使用PHP的本机Zip扩展,它允许您在将文件添加到存档时更改名称(以及稍后)。
的示例$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