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] =>
)
)
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'];
}
}
}