Загрузите несколько файлов в CodeIgniter

В моем проекте CodeIgniter я загружаю файлы во время создания проекта. Здесь функция загрузки:

function uploadFiles(){

     $this->load->library('upload');  
     $error = 0;    
     $projectName = $_POST['projectname'];
     mkdir('./uploads/'.$projectName);

     for($i=0; $i<count($_FILES); $i++)
     {

       $_FILES['userfile']['name']    = $_FILES['files']['name'][$i];
       $_FILES['userfile']['type']    = $_FILES['files']['type'][$i];
       $_FILES['userfile']['tmp_name'] = $_FILES['files']['tmp_name'][$i];
       $_FILES['userfile']['error']       = $_FILES['files']['error'][$i];
       $_FILES['userfile']['size']    = $_FILES['files']['size'][$i];

       $config['upload_path']   = './uploads/'.$projectName;
       $config['allowed_types'] = 'xml|etl';
       $config['max_size']      = '0';
       $config['overwrite']     = TRUE;

      $this->upload->initialize($config);

      if($this->upload->do_upload())
      {
        $error += 0;
      }else{
        $error += 1;
      }
     }

     if($error > 0){ return FALSE; }else{ return TRUE; }

}

И я вызываю эту функцию в функции create_project следующим образом:

public function create_project() {
    $this->load->library('form_validation');

    $this->form_validation->set_rules('projectname', 'Project name', 'required');

    $this->form_validation->set_message('required', 'This is an obligatory field');

    if($this->form_validation->run() == FALSE) {
        $this->load->view('project_creation_view');
    } else {
        $this->load->model('Project_management_model');
        $this->Project_management_model->create_project();
        $this->uploadFiles();
    }
}

Однако это ничего не делает. Файлы не загружаются. Даже пустой каталог не создается. Может ли кто-нибудь помочь мне найти ошибку?

Спасибо.

Ответы

Ответ 1

Вы можете загрузить любое количество файлов.

$config['upload_path'] = 'upload/Main_category_product/';
$path=$config['upload_path'];
$config['allowed_types'] = 'gif|jpg|jpeg|png';
$config['max_size'] = '1024';
$config['max_width'] = '1920';
$config['max_height'] = '1280';
$this->load->library('upload', $config);

foreach ($_FILES as $fieldname => $fileObject)  //fieldname is the form field name
{
    if (!empty($fileObject['name']))
    {
        $this->upload->initialize($config);
        if (!$this->upload->do_upload($fieldname))
        {
            $errors = $this->upload->display_errors();
            flashMsg($errors);
        }
        else
        {
             // Code After Files Upload Success GOES HERE
        }
    }
}

Ответ 2

Это расширение класса CI_Upload, которое я модифицировал для загрузки нескольких файлов, просто скопируйте его в файл MY_Upload.php. Он также создает каталог.

http://pastebin.com/g9J6RxW1

Затем все, что вам нужно сделать в функции контроллера, - это упорядочить ваши файлы в массиве, где имя поля и ключ - это ключи массива, а config - данные. В вашем случае что-то вроде этого:

$project_files['files'][0] = array(
            'upload_path' => './uploads/'.$projectName.'/',
            'max_size' => 0,
            'allowed_types' => 'xml|etl',
            'overwrite' => TRUE,
            'remove_spaces' => TRUE,
        );
$project_files['files'][1] = array(
            'upload_path' => './uploads/'.$projectName.'/',
            'max_size' => 0,
            'allowed_types' => 'xml|etl',
            'overwrite' => TRUE,
            'remove_spaces' => TRUE,
        );

ЕСЛИ все конфиги файлов одинаковы, просто создайте цикл for, чтобы установить это, он также примет "именованные ключи", т.е. $project_files['files']['file_key'].

то просто позвоните:

 if($this->upload->upload_files($project_files)){/*all files uploaded successfully*/}

Ответ 3

Я еще не могу прокомментировать из-за моего уровня репутации, но Zoom сделал комментарий в соответствии с принятым ответом о переменной $fieldname, являющейся массивом, вызвавшим ошибку. У меня была такая же проблема с этим ответом, и выяснилось, что это связано с тем, что я добавил все имена файлов в форме с помощью [], которые заставили php забрать эти входы в виде переменной массива. Чтобы решить эту проблему, просто дайте каждому файлу уникальное имя вместо того, чтобы сделать его массивом PHP. После того, как я это сделал, проблема ушла для меня, и принятый ответ работал как прелесть. Просто подумал, что я передам информацию всем, кто споткнется по этой проблеме.

Ответ 4

Я думаю, вы пропустили это:

$config['file_name']     = 'somename_'.$i;
$config['upload_path']   = './uploads/'.$projectName;
...

Ответ 5

Думал, что я видел здесь такой же точный вопрос раньше;)

Попробуйте вывести $this- > upload- > display_errors(), где вы увеличиваете переменную $error. Это точно скажет вам, что пошло не так. Мои деньги на разрешениях...

Ответ 6

Я изменил Cubed Eye MY_upload, чтобы вернуть информацию о файлах всех загруженных файлов. Как только это было, только последняя информация о файле была доступна при вызове метода данных. Я также добавил IP-адрес загрузчика в этот список.

http://pastebin.com/tG8A85gY

Его можно использовать следующим образом:

$upload_files = $this->upload->upload_files($project_files);
if ($upload_files->status == true)
{
$fileInfo = $uploaded_files->file_info;
}

Я понимаю, что это было бы лучше, чем редактирование Cubed Eye, но это мой первый пост, у меня нет репутации.

Ответ 7

Для простоты я создал этот вспомогательный файл CI. Вы можете загрузить его из файла конфигурации и использовать в любом месте вашего проекта. Просто возьмите 3 патруса

@fileobject = имя объекта HTML файла

@fileopath = путь к файлу, который вы хотите загрузить

@filetypes = default *, ex-jpg | png | mp4 | pdf '

function fileUploader($fileobject, $filepath = "uploads/", $filetypes = "*"){
// retrieve the number of images uploaded;
$number_of_files = sizeof($_FILES[$fileobject]['tmp_name']);

// considering that do_upload() accepts single files, we will have to do a small hack so that we can upload multiple files. For this we will have to keep the data of uploaded files in a variable, and redo the $_FILE.
$files = $_FILES[$fileobject];

$errors = array();
$file_arr = array();
$result = array();

// first make sure that there is no error in uploading the files
for ($k = 0; $k < $number_of_files; $k++) {
    if ($_FILES[$fileobject]['error'][$k] != 0) $errors[$k][] = 'Couldn\'t upload file ' . $_FILES[$fileobject]['name'][$k];
}
if (sizeof($errors) == 0) {
    // now, taking into account that there can be more than one file, for each file we will have to do the upload
    // we first load the upload library
    $CI =& get_instance();

    $CI->load->library('upload'); // load library

    // next we pass the upload path for the images
    $config['upload_path'] = FCPATH . $filepath;
    // also, we make sure we allow only certain type of images
    $config['allowed_types'] = $filetypes;
    //$config['max_size'] = (int)(ini_get('upload_max_filesize'));
    $config['max_size'] = '10000';
    $config['overwrite'] = FALSE;

    for ($i = 0; $i < $number_of_files; $i++) {
        $_FILES['uploadedimage']['name'] = $files['name'][$i];
        $_FILES['uploadedimage']['type'] = $files['type'][$i];
        $_FILES['uploadedimage']['tmp_name'] = $files['tmp_name'][$i];
        $_FILES['uploadedimage']['error'] = $files['error'][$i];
        $_FILES['uploadedimage']['size'] = $files['size'][$i];
        //now we initialize the upload library
        $CI->upload->initialize($config);
        // we retrieve the number of files that were uploaded
        if ($CI->upload->do_upload('uploadedimage')) {
            $imageup = $CI->upload->data();
           // print_r($imageup["orig_name"]);die;
            array_push($file_arr, $imageup["orig_name"]);
            $result["response"] = "true";
            $result["message"] = "Files uploaded successfully.";
            $result["files"] = $file_arr;

        } else {
            $result["response"] = "false";
            $result["message"][$i] = $CI->upload->display_errors();
        }
    }

} else {
    $result["response"] = "false";
    $result["message"] = $errors;

}
return $result;}

Протестировано и проверено.