0

I have the following situation: I need to upload 3 files at once, when the user clicks to do so. There's the code I have in my view:

<?php echo form_open_multipart('uploads/do_upload', 'class="dropzone", id="dropzone-prod", data-nextFormExecDropzone="#dropzone-promo"');?>
   <div class="fallback">
     <input type="file" name="userfile" size="20" />
   </div>
</form>
<?php echo form_open_multipart('uploads/do_upload', 'class="dropzone", id="dropzone-promo", data-nextFormExecDropzone="#dropzone-plan"');?>
   <div class="fallback">
     <input type="file" name="userfile" size="20" />
   </div>
</form>
<?php echo form_open_multipart('uploads/do_upload', 'class="dropzone", id="dropzone-plan"');?>
   <div class="fallback">
     <input type="file" name="userfile" size="20" />
   </div>
</form>
<div class="col-lg-4">
    <button id="processQueue"  class="btn btn-primary" type="button"><i class="fa fa-upload"></i>Start Upload</button>
</div>

When the user clicks in the button, I have a javascript code that sends each form the order I want it to. In my controller, I have the following method (do_upload()):

function do_upload() {
    //$filePath = $this->config->item('base_current_upload_url');
    $filePath = APPPATH.'UPLOADS/';
    $filePathAfterUploaded = $this->config->item('base_uploaded_url');

    $config['upload_path'] = $filePath;
    $config['allowed_types'] = '*';
    $config['max_size'] = 1024 * 100;

    $this->load->library('upload', $config);

    //$this->load->library('csvreader');
    //$filePathAfterUploaded = $this->config->item('base_uploaded_url');
    //print_r($filePath); die();
    $basefilepath = APPPATH.'UPLOADS/';
    $this->load->model('uploads_m');

    if ( ! $this->upload->do_upload('file')) {
        $error = array('error' => $this->upload->display_errors());

        print_r($error);
    }
    else {
        $data = array('upload_data' => $this->upload->data());
        print_r($data); die();
    }

}

PROBLEM:

I need the 3 files to be uploaded. If only one is missing I can't proceed. This way I'm doing, the function do_upload is being called during the upload of each file, so I need to find a way to identify that the 3 files were uploaded. (After that, I'll use mysql 'load data infile' to load data from these files into some tables, but I can only do this if the three were uploaded. Can you help me finding a way to handle this situation?

The structure of the $data everytime do_uplaod is called is this:

Array
(
[upload_data] => Array
    (
        [file_name] => PROMOWEB111120131.txt
        [file_type] => text/plain
        [file_path] => C:/Program Files/EasyPHP-DevServer-13.1VC9/data/localweb/projects/integration/www/application/UPLOADS/
        [full_path] => C:/Program Files/EasyPHP-DevServer-13.1VC9/data/localweb/projects/integration/www/application/UPLOADS/PROMOWEB111120131.txt
        [raw_name] => PROMOWEB111120131
        [orig_name] => PROMOWEB11112013.txt
        [client_name] => PROMOWEB11112013.txt
        [file_ext] => .txt
        [file_size] => 2.67
        [is_image] => 
        [image_width] => 
        [image_height] => 
        [image_type] => 
        [image_size_str] => 
    )

)

1 Answer 1

1

If do_upload is a standalone function, then introduce a static variable that counts the number of calls.

function do_upload () {
    static $count = 0;
    // The rest of your function goes here
    if (no_errors_occurred) {
        static::$count++;
    }
    if ($count == 3) {
        // This function has been called 3 times; trigger something here
    }
}

Better yet, if it's in a class...

class MyClass {
    protected static $data = array ();

    // Other functions and properties

    public function do_upload () {
        // The rest of your function
        if (no_errors_occurred) {
            static::$data[] = array (
                'upload_data' => array (
                    'file_name' => ...,
                    // Populate the data array
                )
            );
        }
        $this->do_mysql_load_data_infile();
    }

    protected function do_mysql_load_data_infile () {
        if (count(static::$data) != 3) {
            return false;
        }
        // Do MySQL load data infile
        // Get information about file uploads by accessing the static::$data array
        foreach (static::$data as $file) {
            echo $file['upload_data']['file_name'];
        }
    }
}
Sign up to request clarification or add additional context in comments.

2 Comments

but how would I identify the name of the file in this do_mysql_load_data_infile ?
See my class example above. Instead of just storing the count, store the data in an array and check the length of the array.

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.