Overview
I have a multi-part form that has four file upload fields and three of these are dynamically added (using JavaScript).
<input type="file" name="OneCertificate" />
<input type="file" id="MultipleCertificate[1] "name="MultipleCertificate[]" />
<input type="file" id="MultipleCertificate[2] "name="MultipleCertificate[]" />
// more if Add button is pressed
Here is the output of var_dump($_FILES)
:
["OneCertificate"]=> array(5) {
["name"]=> string(6) "DE.pdf"
["type"]=> string(15) "application/pdf"
["tmp_name"]=> string(24) "C:\xampp\tmp\php37C2.tmp"
["error"]=> int(0)
["size"]=> int(103845)
}
// **Notice the attributes are all in their own arrays**
["MultipleCertificate"]=> array(5) {
["name"]=> array(2) { [0]=> string(6) "DE.pdf" [1]=> string(6) "DE.pdf" }
["type"]=> array(2) { [0]=> string(15) "application/pdf" [1]=> string(15) "application/pdf" }
["tmp_name"]=> array(2) { [0]=> string(24) "C:\xampp\tmp\phpD941.tmp" [1]=> string(24) "C:\xampp\tmp\phpD942.tmp" }
["error"]=> array(2) { [0]=> int(0) [1]=> int(0) }
["size"]=> array(2) { [0]=> int(103845) [1]=> int(103845) }
}
// and so on...
Below is how I upload each file:
function upload_file($field_name)
{
// timestamp name: http://stackoverflow.com/questions/7457152/did-not-select-a-file-to-upload-when-uploading-using-codeigniter
$the_date= date('Y/n/j h:i:s');
$replace = array(":"," ","/");
$new_name = str_ireplace($replace, "-", $the_date);
$config['upload_path'] = './uploads/';
$config['file_name'] = $new_name;
$config['allowed_types'] = 'pdf|jpg|jpeg|png';
$this->load->library('upload');
$this->upload->initialize($config);
// Get OneCertificate the normal way since it will only have one file content
if ( $field_name == 'OneCertificate' ) {
if ( ! $this->upload->do_upload($field_name)) {
return array('error' => $this->upload->display_errors());
} else {
$file_data = array('upload_data' => $this->upload->data());
}
// Method for MultipleCertificate
} else {
for ($i = 0; $i < count($_FILES[$field_name]['name']); $i++) {
if ( ! $this->upload->do_upload($_FILES[$field_name]['name'][$i])) {
$file_data = array('error' => $this->upload->display_errors());
} else {
$file_data = array('upload_data' => $this->upload->data());
}
} // END for loop
}
return $file_data;
}
The Problem
I noticed that the format of OneCertificate
works since all of its information are in a single array compared to MultipleCertificate
that has each attribute in its own array.
The first manages to successfully upload a file but the latter throws a You did not select a file to upload.
How do I transform and/or retrieve the form of MultipleCertificate
into OneCertificate
?
Note: This is the form I need since I will assign the arrays created to $OneCertificate
and $MultipleCertificate
for database insertion.