Upload multiple files in CodeIgniter

后端 未结 7 1008
谎友^
谎友^ 2020-11-27 18:35

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

function uploadFiles(){

     $this->load->         


        
相关标签:
7条回答
  • 2020-11-27 19:07

    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.

    0 讨论(0)
  • 2020-11-27 19:09

    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.

    0 讨论(0)
  • 2020-11-27 19:13

    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
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-27 19:20

    I think you missed this:

    $config['file_name']     = 'somename_'.$i;
    $config['upload_path']   = './uploads/'.$projectName;
    ...
    
    0 讨论(0)
  • 2020-11-27 19:20

    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...

    0 讨论(0)
  • 2020-11-27 19:21

    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*/}
    
    0 讨论(0)
提交回复
热议问题