2012-01-06 62 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

相關問題