2012-01-06 4 views
3

Я делаю сайт с использованием codeigniter, который позволит пользователям загружать файлы, похожие на gmail. Под этим я подразумеваю, что пользователь может загружать только 1 файл или все файлы в 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, но я не могу переименовать файлы.

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 «s, я нашел решение. Он совершенно прав о том, что Codeigniter не может переименовать файл, но я нашел очень быстрое изменение в библиотеке и, похоже, работает.

Если вы заходите в свою систему> librairies-> Zip.php, как упомянуто @Gordon, найдите «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

+0

, вы можете отправить запрос на перенос в репозиторий git. если они согласятся с этим, другие могут также использовать это изменение. – Gordon

+0

Что такое запрос на растяжение? – denislexic

+1

см. Http://help.github.com/send-pull-requests/ please – Gordon

3

CodeIgniter's Zip Class apparently не предлагает никаких средств для переименования записей. Вы можете использовать встроенную Zip-расширение PHP, которая позволяет вам изменять имя при добавлении файла в архив (а также позже).

Пример из 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

Прохладный, это интересно. Спасибо за ответ @Gordon. Это также хранит его во временном файле, таком как Codeigniter? Под этим я подразумеваю, что после его загрузки он автоматически удаляется? – denislexic

+0

@denislexic Не уверен tbh. Я думаю, что это записано на диск. – Gordon

Смежные вопросы