16

In my CodeIgniter project I'm uploading files during the project creation. Here's the uploading function:

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

}

And I call this function in the create_project function like this:

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();
    }
}

However this does not do anything. The files are not being uploaded. Even an empty directory is not being created. Could anybody help me to find the error?

Thanks.

1
  • check page roytuts.com/codeigniter-multiple-files-upload/ Commented Jun 8, 2016 at 11:15

7 Answers 7

24

You can Upload any number of Files..

$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
        }
    }
}
Sign up to request clarification or add additional context in comments.

4 Comments

Is there a setting for the number of files? I was only able to upload 20 with my codeigniter code and its not much different than this.
It gave me error is_uploaded_file() expects parameter 1 to be string, array given, as I tried to debug, $fieldname is an array.
I tried your code I get one issue with this code. If user upload text file or any other nonimage file with the images (textfile + images) then it uploads some of them and returns the error of file type. Ideally, it may not allow any single image if one of them is not an image. Any help over this? @srbhbarot
@jason I can only upload a max of 20 files, too. Would like a solution.
2

This is an extension of the CI_Upload class that I modified to upload multiple files, just copy this to the MY_Upload.php file. It also makes the directory as well.

http://pastebin.com/g9J6RxW1

Then all you need to do in the controller function is arrange your files into the an array, where the name of the field and the key are the array keys and the config is the data. In you case something like this:

$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,
        );

IF all the files configs are the same just make a for loop to set this up, it will also take 'named keys', ie. $project_files['files']['file_key'].

then just call:

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

Comments

1

I can't comment yet because of my reputation level but Zoom made a comment under the accepted answer about the $fieldname variable being an array which caused an error. I had the same issue with that answer and found out that it was because I had appended all my file input names on the form with [] which made php pick up the those inputs as an array variable. To resolve that issue just give each file input a unique name instead of making it a PHP array. After I did that, the issue went away for me and the accepted answer worked like a charm. Just thought I'd pass the info along for anyone else who stumbles across this issue.

2 Comments

What do you mean give each file input a unique name? There is a difference between using a single <input type="file" name="files[]" multiple="multiple" /> and using multiple input field lines. With the single input field, you can select multiple files from the file browser window. With multiple input fields you can only choose one file at a time, and I think that degrades the select multiple files feature, but I guess it works. Maybe you could explain a little more what you mean?
Also, I am using the name='files[]' too, so I know what you're driving at. In the Ajax call I loop through the files[] like this: formData.append('date',document.getElementById('date').value); var ins = document.getElementById('files').files.length; for (var x = 0; x < ins; x++) { formData.append("files[]", document.getElementById('files').files[x]); } In the Controller, this produces a $_FILES array, which you can check with echo "<pre>"; print_r($_FILES); echo "</pre>"; Still, the above accepted answer isn't working for me, so I'm still doing something wrong. :/
0

I think you missed this:

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

Comments

0

Thought I saw this same exact question here before ;)

Try outputting $this->upload->display_errors() where you're incrementing the $error variable. That will tell you exactly what went wrong. My money's on permissions...

Comments

0

I modified Cubed Eye's MY_upload to return the file information of all files uploaded. As it was, only the last file's information was accessible when calling the data method. I also added the IP address of the uploader to that list.

http://pastebin.com/tG8A85gY

It can be utilized by the following:

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

I realize this would be better off as an edit to Cubed Eye but this is my first post, I have no reputation.

Comments

0

For the simplicity,I've created this CI helper file.You can load it from config file & use anywhere in your project.It just take 3 patrameters

@fileobject = name of HTML file object

@fileopath = file path that you want to upload

@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;}

Tested & proven.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.