Загрузите несколько файлов в 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(); } } 

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

Благодарю.

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

 $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 } } } 

Это расширение класса 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, чтобы установить это, он также примет «named keys», т.е. $project_files['files']['file_key'] .

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

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

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

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

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

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

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

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

http://pastebin.com/tG8A85gY

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

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

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

Для простоты я создал этот вспомогательный файл 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;} 

Проверено и проверено.