Загрузить несколько файлов в CodeIgniter - PullRequest
16 голосов
/ 04 декабря 2011

В моем проекте 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();
    }
}

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

Спасибо.

Ответы [ 7 ]

23 голосов
/ 05 декабря 2011

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

$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 голосов
/ 04 декабря 2011

Это расширение класса 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*/}
1 голос
/ 20 июля 2016

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

0 голосов
/ 12 июля 2016

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

Проверено и доказано.

0 голосов
/ 14 августа 2013

Я изменил 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;
}

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

0 голосов
/ 05 декабря 2011

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

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

0 голосов
/ 04 декабря 2011

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

$config['file_name']     = 'somename_'.$i;
$config['upload_path']   = './uploads/'.$projectName;
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...