I want to insert underscore before the counting index every time I upload multiple files.
What I expect:
Schools.jpg
Schools_1.jpg
Schools_2.jpg
Schools_3.jpg
My program output:
Schools.jpg
Schools1.jpg
Schools2.jpg
Schools3.jpg
Here's my code:
Controller
public function do_upload() {
$this->load->library('upload');
$files = $_FILES;
$cpt = count($_FILES['userfile']['name']);
for($i=0; $i<$cpt; $i++) {
$_FILES['userfile']['name']= $files['userfile']['name'][$i];
$_FILES['userfile']['type']= $files['userfile']['type'][$i];
$_FILES['userfile']['tmp_name']= $files['userfile']['tmp_name'][$i];
$_FILES['userfile']['error']= $files['userfile']['error'][$i];
$_FILES['userfile']['size']= $files['userfile']['size'][$i];
$this->upload->initialize($this->set_upload_options());
$this->db->insert('tbl_image', $file_array);
}
}
private function set_upload_options() {
$config = array(
'image_library' => 'gd2',
'file_name' => $this->input->post('file_name'),
'upload_path' => './public/img/uploads',
'upload_url' => base_url().'public/img/uploads',
'allowed_types' => 'jpg|jpeg|pdf',
'max_size' => '1024KB',
'max_width' => '1024',
'max_height' => '768',
'maintain_ratio'=> TRUE,
'overwrite' => false,
);
return $config;
}
HTML
<label for="file">Select File To Upload:</label>
<input type="file" name="userfile[]" multiple/>
<label for="file_name">Set image file name:</label>
<input type="text" size="20" name="file_name" required id="file_name"/>
<input type="submit" id="btnSubmit" value="Upload File"/>
I saw a lot of wrong suggested answer, they put underscore in the index of array, like this
$_FILES['userfile']['name']= $files['userfile']['name'][$i]."_".[$i];
//you can't do this because $file['userfile']['name'][$i] is array so better do this code
$flag=0;
for($i=0; $i<$cpt; $i++) {
$flag++;
$_FILES['userfile']['name']=$files['userfile']['name'][$i];
$_FILES['userfile']['type']= $files['userfile']['type'][$i];
$_FILES['userfile']['tmp_name']= $files['userfile']['tmp_name'][$i];
$_FILES['userfile']['error']= $files['userfile']['error'][$i];
$_FILES['userfile']['size']= $files['userfile']['size'][$i];
$this->upload->initialize($this->set_upload_options($i, $flag));
$this->db->insert('tbl_image', $file_array);
}
private function set_upload_options($i, $f) {
$charac= "";
if($f>1) {
$charac=$this->input->post('file_name')."_".$i;
//here is the code to add underscore for image 2 and above
}
else {
$charac=$this->input->post('file_name');
}
$config = array(
'image_library' => 'gd2',
'file_name' => $charac,
'upload_path' => './public/img/uploads',
'upload_url' => base_url().'public/img/uploads',
'allowed_types' => 'gif|jpg|jpeg',
'max_size' => '1024KB',
'max_width' => '1024',
'max_height' => '768',
'maintain_ratio'=> TRUE,
'overwrite' => false,
);
return $config;
}
Change this line
for($i=0; $i<$cpt; $i++) {
$_FILES['userfile']['name']= $files['userfile']['name'][$i]."_".[$i];
$_FILES['userfile']['type']= $files['userfile']['type'][$i];
$_FILES['userfile']['tmp_name']= $files['userfile']['tmp_name'][$i];
$_FILES['userfile']['error']= $files['userfile']['error'][$i];
$_FILES['userfile']['size']= $files['userfile']['size'][$i];
$this->upload->initialize($this->set_upload_options());
$this->db->insert('tbl_image', $file_array);
}
change the below line from:
$_FILES['userfile']['name']= $files['userfile']['name']."_".[$i];
to
$prefix = 'Schools'; // May also use $prefix = $_POST['prefix'];
$_FILES['userfile']['name']= str_replace($prefix, "Schools_" . $i, $files['userfile']['name'][$i])
Just change first line of your loop:
// find position of the last dot, so where the extension starts
$extension_pos = strrpos($files['userfile']['name'][$i], '.');
// insert underscore and numbering before filetype
$newname = substr($files['userfile']['name'][$i], 0, $extension_pos) . '_' . $i . substr($filename, $extension_pos);
// set new formated name to our file
$_FILES['userfile']['name'] = $newname;
or you may use just one line changes :
$_FILES['userfile']['name'] = preg_replace("/(\w+)\.(\w+)/","'\\1_".$i.".\\2'", $files['userfile']['name'][$i]);
it will add underscore before filetype .
You can do it simple way by modifying upload library.Upload library adds the numbers if file exists.You can change it adding "_".
Open codeigniter folder /system/Upload.php
at line 403 replace the line $filename = str_replace($this->file_ext, '', $filename);
with
$filename = str_replace($this->file_ext, '_', $filename);
If the line number is not same then search the text. Hope it will help you.