In my controller I have the following functions that upload an image to a local directory which works fine. I now want to store in the db. I just need to figure out where to put the code I already have and think is correct.
I need to insert this:
$this->location->store_file_path($file);
into either before or after the pic is uploaded in local directory. Where should it go?
Controller:
public function image() {
//type must either be type=logo or type=profile_picture
if (isset($_FILES['file']) && isset($_POST['type'])) {
//Codeigniter upload
$config['upload_path'] = 'uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['encrypt_name'] = TRUE;
$config['max_size'] = 5120;
$config['max_width'] = '1024';
$config['max_height'] = '768';
$this->upload->initialize($config);
if (!$this->upload->do_upload('file')) {
$status = 'error';
$msg = $this->upload->display_errors('', '');
} else {
$data = $this->upload->data();
//$file_id = $this->files_model->insert_file($data['file_name'], $_POST['title']);
if ($data) {
$status = "success";
$data['url'] = $config['upload_path'] . $data['file_name'];
$msg = $data;
} else {
unlink($data['full_path']);
$status = "error";
$msg = "Something went wrong when saving the file, please try again.";
}
}
} else {
$status = "error";
$msg = "Please select a file to upload";
}
echo json_encode(array('status' => $status, 'msg' => $msg));
}
Here is my model function:
public function store_file_path($file)
{
$this->db->insert('TACTIFY_locationcards', 'name'=>$file);
}
change the following line in controler
$status = "success";
+ $file = $config['upload_path'] . $data['file_name'];
+ $this->location->store_file_path($file);
$msg = $file;
change the model
public function store_file_path($file)
{
+ $this->db->set('name', $file);
+ $this->db->insert('TACTIFY_locationcards');
- $this->db->insert('TACTIFY_locationcards', 'name'=>$file);
}
I suggest you only write to a database once all verification has been done and the data has been written to the file.
If I read your code correctly success is at the point:
if ($data) {
$status = "success";
$data['url'] = $config['upload_path'] . $data['file_name'];
$msg = $data;
I would put the line here:
if ($data) {
$status = "success";
$data['url'] = $config['upload_path'] . $data['file_name'];
$msg = $data;
$this->location->store_file_path($file);
Related
I am trying to insert 1 image in 2 different directories but it is saving only in the first directory but not in the second directory.I am unable find the mistake in my code,please check the below code and help us.Thanks in advance.
public function image()
{
$data = array();
$error = array();
$config1=array(
'upload_path'=>'upload/',
'allowed_types'=>'jpg|jpeg|png|bmp',
'max_size'=>0,
'filename'=>url_title($this->input->post('file'))
);
$this->load->library('upload',$config1);
if($this->upload->do_upload('file')){
$error = array('error' => $this->upload->display_errors());
echo "<pre>";
print_r($error);
exit();
}else {
$fdata = $this->upload->data();
$data['image'] = 'upload/' . $fdata['file_name'];
}
$config2=array(
'upload_path'=>'upload/images/',
'allowed_types'=>'jpg|jpeg|png|bmp',
'max_size'=>0,
'filename'=>url_title($this->input->post('file'))
);
$this->upload->initialize($config2);
if (!$this->upload->do_upload('file')){
$error = array('error' => $this->upload->display_errors());
echo "<pre>";
print_r($error);
exit();
} else {
$fdata = $this->upload->data();
$data['file2'] = 'upload/images' . $fdata['file_name'];
}
$data['name'] = $this->input->post('dname', TRUE);
$data['email'] = $this->input->post('demail', TRUE);
$data['mobile'] = $this->input->post('dmobile', TRUE);
$data['mobile'] = $this->input->post('daddress', TRUE);
$result = $this->insert_model->insert($data);
$sdata = array();
$sdata['message'] = "Well done!</strong> You successfully add the
Product Details.";
$this->session->set_userdata($sdata);
redirect('super_admin/add_product', 'refresh');
}
You should make a method for upload, so you can use it more times.
/**
* Upload a file.
*
* #param $field
* #param $upload_path
* #param string $allowed_types
* #return bool | file_name
*/
public function do_upload($field, $upload_path, $allowed_types = 'jpg|png|gif')
{
$config['upload_path'] = $upload_path;
$config['allowed_types'] = $allowed_types;
$config['max_size'] = 500;
$config['max_width'] = 1024;
$config['max_height'] = 1024;
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload($field))
{
$this->upload = null; // Unload library
return FALSE;
}
else
{
$data = $this->upload->data();
$this->upload = null; // Unload library
return $data["file_name"];
}
}
Now you can use it in image().
Example
public function image()
{
$data = array();
// For 1st directory
if ($data['image'] = $this->do_upload('your_filed_name', 'upload/')) {
// Statements
// $data['image'] = 'upload/' . $data['image']
} else {
$data['errors'] = array('error' => $this->upload->display_errors());
}
// For 2st directory
if ($data['image'] = $this->do_upload('your_filed_name', 'upload/images/')) {
// Statements
// $data['image2'] = 'upload/images/' . $data['image']
} else {
$data['errors'] = array('error' => $this->upload->display_errors());
}
// Your rest of logic
}
Try this
public function image()
{
$data = array();
$error = array();
$config1=array(
'upload_path'=>'upload/',
'allowed_types'=>'jpg|jpeg|png|bmp',
'max_size'=>0,
'filename'=>url_title($this->input->post('file'))
);
$this->load->library('upload',$config1,'file1'); // Create custom object for file 1 upload
if($this->file1->do_upload('file')){
$error = array('error' => $this->file1->display_errors());
echo "<pre>";
print_r($error);
exit();
}else {
$fdata = $this->file1->data();
$data['image'] = 'upload/' . $fdata['file_name'];
}
$config2=array(
'upload_path'=>'upload/images/',
'allowed_types'=>'jpg|jpeg|png|bmp',
'max_size'=>0,
'filename'=>url_title($this->input->post('file'))
);
$this->load->library('upload', $config2, 'file2'); // Create custom object for file 2 upload
$this->file2->initialize($config2);
if (!$this->file2->do_upload('file')){
$error = array('error' => $this->file2->display_errors());
echo "<pre>";
print_r($error);
exit();
} else {
$fdata = $this->file2->data();
$data['file2'] = 'upload/images' . $fdata['file_name'];
}
$data['name'] = $this->input->post('dname', TRUE);
$data['email'] = $this->input->post('demail', TRUE);
$data['mobile'] = $this->input->post('dmobile', TRUE);
$data['mobile'] = $this->input->post('daddress', TRUE);
$result = $this->insert_model->insert($data);
$sdata = array();
$sdata['message'] = "Well done!</strong> You successfully add the
Product Details.";
$this->session->set_userdata($sdata);
redirect('super_admin/add_product', 'refresh');
}
My problem resolved with following code:
public function image()
{
$config['upload_path'] = './upload/images';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 0;
$this->load->library('upload', $config);
if (!$this->upload->do_upload('userfile')){
} else {
$fdata = $this->upload->data();
$data['file2'] = 'upload/images' . $fdata['file_name'];
}
$config2=array(
'upload_path'=>'upload/',
'allowed_types'=>'jpg|jpeg|png|bmp',
'max_size'=>0,
);
$this->upload->initialize($config2);
if($this->upload->do_upload('userfile')){
$data = array(
'name' =>$this->input->post('name'),
'email' =>$this->input->post('email'),
'phone' =>$this->input->post('phone'),
'title' =>$this->input->post('someField'),
'image'=>$this->upload->file_name,
);
//Transfering data to Model
$this->insert_model->add($data);
}
else
{
$data = array('upload_data' => $this->upload->data());
$this->load->view('upload_success', $data);
}
}
}
I want to crop my image upload and change my profile photo, but I don't know why it's not working even the picture was upload, profile picture not change, you must logout and picture was be change. this is my controller.
private $pk = 'nim';
private $table = 'mahasiswa';
public function update()
{
$nim = $this->session->userdata('nim');
if($_POST) {
$file = $this->upload();
if ($this->m_data->update($this->pk, $nim, $this->table, $this->field_data($file['data']))) {
redirect('Mahasiswa/Profil');
}
} else {
redirect('Mahasiswa/Formubah');
}
}
private function field_data($file = '')
{
$data['username'] = $this->input->post('username');
$data['password'] = $this->input->post('password');
if ($file != '') {
$data['foto'] = $file['file_name'];
}
return $data;
}
public function upload()
{
$config['upload_path'] = './assets/image/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 0;
$config['remove_spaces'] = TRUE;
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload('foto')){
return[
'data' => $this->upload->display_errors(),
];
} else {
$data = $this->upload->data();
$resize['image_library'] = 'gd2';
$resize['x_axis'] = 50;
$resize['y_axis'] = 50;
$resize['width'] = $img['config']['foto']['width'];
$this->image_lib->initialize($resize);
$this->image_lib->crop();
return [
'data' => $this->upload->data(),
];
}
}
i hope controller was enough. i forgot to tell, i use this show my picture. <?php echo base_url('assets/image/').$this->session->userdata('foto');?>
You are not properly implementing the library. Y forgot the library load and have not given its path.
$image_data = $this->upload->data();
$config['image_library'] = 'imagemagick';
$config['library_path'] = 'C:ImageMagick-7.0.1-3-portable-Q16-x86';//your library
$config['source_image'] = $image_data['full_path']; //get original image
$config['x_axis'] = 50;
$config['y_axis'] = 50;
$this->load->library('image_lib', $config);
if (!$this->image_lib->crop()) {
$this->handle_error($this->image_lib->display_errors());
}
I've a file uploader. I do the overwrite through the data. It makes me upload these data:
- Pict1.jpg
- Pict12.jpg
- Pict13.jpg
But when I tried to return it, its only showing pict1.jpg. Here the code
Controller:
function send(){
$mariupload = $this->upload_gambar($_FILES['gambar']);
if ($mariupload === FALSE) {
$upload = false;
}
if($upload = false){
$error = array('error' => $this->upload->display_errors());
$this->load->view('upload_form', $error);
} else {
$dataupload = $mariupload;
echo $dataupload;
}
private function upload_gambar($files){
//config buat upload gambar
$config['upload_path'] = 'path to upload';
$config['allowed_types'] = 'gif|jpg|png|jpeg';
$config['max_size'] = '1024';
$config['overwrite'] = '0';
$this->load->library('upload', $config);
$gambar = array();
if (is_array($files['name']) || is_object($files['name'])){
foreach ($files['name'] as $key => $gambar) {
$_FILES['gambar[]']['name']= $files['name'][$key];
$_FILES['gambar[]']['type']= $files['type'][$key];
$_FILES['gambar[]']['tmp_name']= $files['tmp_name'][$key];
$_FILES['gambar[]']['error']= $files['error'][$key];
$_FILES['gambar[]']['size']= $files['size'][$key];
$fileName = $gambar;
$images[] = $fileName;
$config['file_name'] = $fileName;
$this->upload->initialize($config);
if ($this->upload->do_upload('gambar[]')) {
$dataupload = $this->upload->data('file_name');
return $dataupload.'<br>';
} else {
$mariupload = false;
}
}
}
}
When i try to echo $dataupload in upload_gambar function, it works as an array. But its returning as a single data to send() function. Any idea?
Because you are sending just single file
$mariupload = $this->upload_gambar($_FILES['gambar']);
change this to
$mariupload = $this->upload_gambar($_FILES);
then in your upload_gambar handle it as foreach
You have a return inside the loop. A return will interrupt the loop as the function will not continue to be executed. Try to feed up an array instead.
Replace
return $dataupload.'<br>';
With
$return[] = $dataupload;
And at the end of the function append:
return $return;
I finally found the solution. Thanks to Jovi Wang on Facebook (https://www.facebook.com/jovi.wang.96?fref=ufi) . This is the clean code:
function send(){
$try = $this->upload_multiple($_FILES['gambar']);
if(!$try = false){
$anu= $this->upload_multiple($_FILES['gambar']);
foreach($anu as $key => $anu2){
echo $anu2.'<br>';
}
}
public function upload_multiple($files)
{
// echo '<pre>';
// print_r($files);
// echo '</pre>';
$config['upload_path'] = 'path to upload';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 1024;
$config['overwrite'] = 0;
$config['encrypt_name'] = TRUE;
$this->load->library('upload');
$this->upload->initialize($config);
$data = array();
foreach($files['name'] as $key => $value)
{
if ( ! empty($files['name'][$key]))
{
$_FILES['gambar_single']['name'] = $files['name'][$key];
$_FILES['gambar_single']['name'] = $files['name'][$key];
$_FILES['gambar_single']['type'] = $files['type'][$key];
$_FILES['gambar_single']['tmp_name'] = $files['tmp_name'][$key];
$_FILES['gambar_single']['error'] = $files['error'][$key];
$_FILES['gambar_single']['size'] = $files['size'][$key];
if ($this->upload->do_upload('gambar_single'))
{
$data[] = $this->upload->data('file_name');
}
else
{
$data[] = $this->upload->display_errors();
}
}
else
{
$data[] = 'empty upload';
}
}
return $data;
}
<?php
public function videoupld()
{
$this->load->helper('string');
$config['upload_path'] = 'assets/upload/video'; # check path is correct
$config['max_size'] = '102400000';
$config['allowed_types'] = 'mp4'; # add video extenstion on here
$config['overwrite'] = FALSE;
$config['remove_spaces'] = TRUE;
$video_name =$_FILES['video_image']['name'];`
$config['file_name'] = $video_name;
$this->load->library('upload', $config);
$this->upload->initialize($config);
if ( ! $this->upload->do_upload('video_image'))
{
echo 'fail';
return;
//redirect('Admin/video_upload');
}
else
{
$data = array('upload_data' => $this->upload->data());
$this->load->view('upload_success', $data);
$url = 'assets/upload/video'.$video_name;
$this->Admin_model->videoupld($url);
redirect('Admin/video_upload');
}
}
?>
model
public function videoupld($url)
{
$title = $this->input->post('video_image');
//$details = $this->input->post('details');
//$type = $this->input->post('gallery');
$data = array(
'title' => $title,
'url' => $url,
//'category' => $type`
);
$this->db->insert('videoss', $data);
}
$uploaded = $this -> upload -> do_upload('video_image');
//here you will receive the object that you uploaded
// you will test if the file exist if yes the variable $file will recieve the full path
if ($uploaded) {
if ($data['file_ppt'] != '') {
$file = 'uploads/ppt/' . $data['file_ppt']; //full path
if (file_exists($file)) {
unlink($file);
}
}
}
//if file uploaded
//$save['file_ppt'] will have the name of the file uploaded
if ($uploaded) {
$file_ppt = $this -> upload -> data();
$save['file_ppt'] = $file_ppt['file_name'];
}
$uploaded = $this -> upload -> do_upload('video_image');
if ($uploaded) {
if ($data['file_ppt'] != '') {
$file = 'uploads/ppt/' . $data['file_ppt'];
if (file_exists($file)) {
unlink($file);
}
}
}
if ($uploaded) {
$file_ppt = $this -> upload -> data();
$save['file_ppt'] = $file_ppt['file_name'];
}
$this->db->insert('videoss', $save);
put this in the view :
and in controller : $names ="";
$name_array = array();
if(isset($_FILES['file_ppt'])){
$count = count($_FILES['file_ppt']['size']);
}else{
$count=0;
}
foreach($_FILES as $key=>$value)
for($s=0; $s<=$count-1; $s++) {
$_FILES['file_ppt']['name']=md5(time())."".$value['name'][$s];
$_FILES['file_ppt']['type'] = $value['type'][$s];
$_FILES['file_ppt']['tmp_name'] = $value['tmp_name'][$s];
$_FILES['file_ppt']['error'] = $value['error'][$s];
$_FILES['file_ppt']['size'] = $value['size'][$s];
// $config['allowed_types'] = 'gif|jpg|png';
$config['upload_path'] = 'uploads/messages';
$config['allowed_types'] = '*';
$config['max_size'] = '200000';
$this->load->library('upload', $config);
$uploaded = $this->upload->do_upload('file_ppt');
$data = $this->upload->data();
$names = $names.','.$_FILES['file_ppt']['name'];
}
if ($uploaded) {
// $file_ppt = $this -> upload -> data();
$save['file_ppt'] = $names;
// print_r('file ppt'.$file_ppt['file_name']);
}else {
echo $this->upload->display_errors();
}
I want to insert image(path only) to database.I have written this code but here every time the default.png(path only) is inserted.I want to insert other images also.
$maxId = $this->user_master_m->get_max_product_id();
$new_file = "defualt.png";
if ($_FILES["image"]['name'] != "") {
$file_name = $_FILES["image"]['name'];
$file_name_rename = 'P-' . $maxId->id;
$explode = explode('.', $file_name);
if (count($explode) >= 2) {
$new_file = $file_name_rename . '.' . $explode[1];
$config['upload_path'] = "./uploads/images";
$config['allowed_types'] = "gif|jpg|png";
$config['file_name'] = $new_file;
$config['max_size'] = '1024';
$config['max_width'] = '3000';
$config['max_height'] = '3000';
$array['product_image'] = $new_file;
$this->load->library('upload', $config);
if (!$this->upload->do_upload("image")) {
$this->data["image"] = $this->upload->display_errors();
$this->data["subview"] = "admin_view/product_form_view";
$this->load->view('_layout_main', $this->data);
} else {
$data = array("upload_data" => $this->upload->data());
$this->user_master_m->add_product_m($array);
}
} else {
$this->data["image"] = "Invalid file";
$this->data["subview"] = "admin_view/product_form_view";
$this->load->view('_layout_main', $this->data);
}
} else {
$array["product_image"] = $new_file;
$this->user_master_m->add_product_m($array);
}
Try to print $_FILES by
print_r($_FILES);
to check whether you are getting the image properly or not.