Codeigniter Upload featured image and multiple images at the same time - php

I have modified the code to use a foreach loop, now I can access the files names, and the print_r is printing the files names in an array like this:
Array ( [0] => Uconn.png [1] => UW_Medicine.png [2] => Yale.png ) Axis.png
but I am still getting the following error:
A PHP Error was encountered
Severity: Notice
Message: Array to string conversion
and a databse error:
Error Number: 1054
Unknown column 'Array' in 'field list'
INSERT INTO `yacht_slider` (`yacht_slide_id`, `slide`) VALUES (87, Array)
I just don't know how should I pass the looped files inside the model to upload.
I am trying to upload a featured image in one input, and multiple images in another input at the same time, I tried many ways and methods to do this, but I always end with an error, mostly Array to string conversion error.
the featured image is stored in one database table and the multiple images are stored in another table.
My current code:
HTML:
<div class="form-group">
<label for="" class="control-label">Image</label>
<input type="file" class="form-control" name="featured">
</div>
<div class="form-group">
<label for="" class="control-label">Slider</label>
<input type="file" class="form-control" name="userfile[]" multiple>
</div>
Model:
public function create_yacht($yacht_img, $slider){
$slug = url_title($this->input->post('title'));
$data = array(
'title' => $this->input->post('title'),
'slug' => $slug,
'img' => $yacht_img,
'city' => $this->input->post('city'),
'category' => $this->input->post('category'),
'price' => $this->input->post('price'),
'description' => $this->input->post('description')
);
$this->db->insert('yachts', $data);
$insert_id = $this->db->insert_id();
$data_4 = array(
'yacht_slide_id' => $insert_id,
'slide' => $slider
);
$this->db->insert('yacht_slider', $data_4);
}
Controller:
public function create_yacht(){
$data['title'] = 'Create';
$data['categories'] = $this->category_model->get_categories();
$this->form_validation->set_rules('title', 'Title', 'required');
$this->form_validation->set_rules('city', 'City', 'required');
if($this->form_validation->run() === FALSE){
$this->load->view('templates/admin_header');
$this->load->view('admin/create_yacht', $data);
$this->load->view('templates/admin_footer');
}else{
$config['upload_path'] = './assets/images';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '2048';
$this->load->library('upload', $config);
$featured = 'featured';
if (!$this->upload->do_upload($featured)) {
$errors = array('errors' => $this->upload->display_errors());
$yacht_img = 'https://via.placeholder.com/1920x1080';
}else{
$data = array('upload_data' => $this->upload->data());
$yacht_img = $_FILES['featured']['name'];
}
foreach ($_FILES['userfile']['name'] as $name) {
$this->upload->initialize($config);
$this->upload->do_upload($name);
$data = array('upload_data' => $this->upload->data());
$slider = $_FILES['userfile']['name'];
}
print_r($slider);
print_r($yacht_img);
$this->yacht_model->create_yacht($yacht_img, $slider);
// redirect('admin');
}
}

I've cleaned up your code a bit and put in some error reporting so users won't be befuddled when an error occurs.
Controller:
public function create_yacht() {
$data['title'] = 'Create';
$data['categories'] = $this->category_model->get_categories();
$this->form_validation->set_rules('title', 'Title', 'required');
$this->form_validation->set_rules('city', 'City', 'required');
if ($this->form_validation->run() === FALSE) {
$this->load->view('templates/admin_header');
$this->load->view('admin/create_yacht', $data);
$this->load->view('templates/admin_footer');
} else {
$this->load->library('upload');
$upload_path = './testupload/';
// just in case, make path if it doesn't exist
// if we can't die
if (!is_dir($upload_path) && #mkdir($upload_path, DIR_WRITE_MODE) == false) {
show_error('Could not make path!');
}
$config['upload_path'] = $upload_path;
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '2048';
$config['file_ext_tolower'] = true;
//$config['encrypt_name'] = true; // might be a good idea
$this->upload->initialize($config);
// featured image
if (!$this->upload->do_upload('featured')) {
show_error($this->upload->display_errors());
}
$yacht_img = $this->upload->data('file_name');
// multi images
$slider_images = array();
$multi_files = $_FILES['userfile'];
if (!empty($multi_files['name'][0])) { // if slider images are required remove this if
$multi_count = count($_FILES['userfile']['name']);
for ($i = 0; $i < $multi_count; $i++) {
$_FILES['userfile']['name'] = $multi_files['name'][$i];
$_FILES['userfile']['type'] = $multi_files['type'][$i];
$_FILES['userfile']['tmp_name'] = $multi_files['tmp_name'][$i];
$_FILES['userfile']['error'] = $multi_files['error'][$i];
$_FILES['userfile']['size'] = $multi_files['size'][$i];
if (!$this->upload->do_upload()) {
// failure cleanup to prevent orphans
#unlink($upload_path . $yacht_img);
if (count($slider_images) > 0) {
foreach ($slider_images as $image) {
#unlink($upload_path . $image);
}
}
show_error($this->upload->display_errors());
}
$slider_images[] = $this->upload->data('file_name');
}
}
$this->yacht_model->create_yacht($yacht_img, $slider_images);
}
}
Model:
public function create_yacht($yacht_img, $slider_images) {
$slug = url_title($this->input->post('title'));
$data = array(
'title' => $this->input->post('title'),
'slug' => $slug,
'img' => $yacht_img,
'city' => $this->input->post('city'),
'category' => $this->input->post('category'),
'price' => $this->input->post('price'),
'description' => $this->input->post('description')
);
$this->db->insert('yachts', $data);
$insert_id = $this->db->insert_id();
if (count($slider_images) > 0) {
foreach ($slider_images as $image) {
$this->db->insert('yacht_slider', array('yacht_slide_id' => $insert_id, 'slide' => $image));
}
}
}

if you are using mySQL 7 then it supports json datatype and you can save as array. If your using lower version of MySQL best solution is to convert your image array into JSON format then insert that into table.
For more details on JSON in MySQL you can refer
https://dev.mysql.com/doc/refman/8.0/en/json.html#json-values

Related

codeigniter error Message: Cannot modify header information - headers already sent by

im getting this error whenever i insert something into the database it insters the data but i recieve this error
Message: Cannot modify header information - headers already sent by (output started at project/application/controllers/add_products.php:79)
function do_upload() {
$config['upload_path'] = './assets/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '2000';
$config['max_width'] = '2000';
$config['max_height'] = '2000';
$config['new_image'] = './assets/';
$config['overwrite'] = TRUE;
$this->load->library('upload', $config);
$this->form_validation->set_rules('name', 'Product Name', 'required|xss_clean');
$this->form_validation->set_rules('description', 'Product Description', 'required|xss_clean');
$this->form_validation->set_rules('price', 'Price', 'required');
if (!$this->upload->do_upload() || !$this->form_validation->run()) {
$error = array('error' => $this->upload->display_errors());
redirect('add_products');
} else {
$data = $this->upload->data();
$this->thumb($data);
$category = $_POST["prod_category"];
if($category == "2")
{
$category = $_POST["other_category"];
}
$file = array(
'img_name' => $data['raw_name'],
'thumb_name' => $data['raw_name'] . '_thumb',
'ext' => $data['file_ext'],
'product_name' => $this->input->post('name'),
'product_description' => $this->input->post('description'),
'product_price' => $this->input->post('price'),
'product_category' =>$category,
);
// $this->db->insert("product_category",array("category"=>$category));
$query = 'INSERT INTO product_category (id , category) VALUES (? , ?)
ON DUPLICATE KEY UPDATE category=VALUES(category)';
$this->User->insert_prod($file);
$data = array('upload_data' => $this->upload->data());
echo '<script>alert("You Have Successfully Added a new Product!");</script>';
redirect('admin_products','refresh');
$this->load->view('admin_products');
}
}
remove line
echo '<script>alert("You Have Successfully Added a new Product!");</script>';
put ob_start(); after first < ?php line
so your code should be:
<?php
ob_start();
it will turn on the output buffering

uploading image in codeigniter controller

i'am not able to do upload image with lines of code in function add()
just provide me with some solution for uploading image
public function add()
{
if ($this->input->server('REQUEST_METHOD') === 'POST')
{
$this->form_validation->set_rules('image', 'image', 'required');
$this->form_validation->set_rules('text', 'text', 'required');
$this->form_validation->set_error_delimiters('<div class="alert alert-error"><a class="close" data-dismiss="alert">×</a><strong>', '</strong></div>');
if ($this->form_validation->run())
{
**$data_to_insert = array(
'image' => $this->input->post('image'),
'text' => $this->input->post('text'),**
);
if($this->home_banner_model->insert_home_banner($data_to_insert)){
$data['flash_message'] = TRUE;
}else{
$data['flash_message'] = FALSE;
}
}
}
$data['main_content'] = 'admin/home_banner/add';
$this->load->view('includes_admin/template', $data);
}
$config = array(
'upload_path' => 'uploadPath',
'allowed_types' => 'jpg,jpeg',
'max_size' => 1500
);
$this->load->library('upload', $config);
if(isset($_FILES['field_name']) && $_FILES[field_name]['name'] != NULL)
if($this->upload->do_upload('field_name'))
{
$upload_data = $this->upload->data();
$data_to_insert = array(
'attachment_link' => 'uploadPath/'.$upload_data['file_name'],
'attachment_size' => $upload_data['file_size']
// u can add parameters as for ur table to save
);
$this->home_banner_model->insert_home_banner($data);
}
else
{
echo $this->upload->display_errors();
}

Codeigniter: how to edit form without edit image input

I need a small help to figure out the edit page.
I have the Insert data and Edit data.
On edit data is requesting also the form for file/image upload, and on submit this send the null to the column file/image.
What i need is that on edit if no new file is on file/image input to skip this input.
This is my controller to insert and edit data.
// Set up the form
$rules = $this->image_m->rules;
$this->form_validation->set_rules($rules);
// Upload File Image
$status = "";
$msg = "";
$file_element_name = 'file_name';
if ($status != "error")
{
$config['upload_path'] = './uploads/images/';
$config['allowed_types'] = 'gif|jpg|png|doc|txt';
$config['max_size'] = '2000';
$config['max_width'] = '1024';
$config['max_height'] = '768';
$config['encrypt_name'] = FALSE;
$config['remove_spaces'] = TRUE;
$this->load->library('upload', $config);
if (!$this->upload->do_upload($file_element_name))
{
$status = 'error';
$msg = $this->upload->display_errors('', '');
}
else
{
$image = $this->upload->data();
}
}
// Process the form
if ($this->form_validation->run() == TRUE) {
$data = array(
'pubdate' => $this->input->post('pubdate'),
'enddate' => $this->input->post('enddate'),
'name' => $this->input->post('name'),
'image' => $image['file_name']
);
$this->image_m->save($data, $id);
redirect('admin/image');
}
Any help is appreciated.
Solution:
// Process the form
if ($this->form_validation->run() == TRUE) {
if(is_null($image['file_name'])){
$data = array(
'pubdate' => $this->input->post('pubdate'),
'enddate' => $this->input->post('enddate'),
'name' => $this->input->post('name'),
'caption' => $this->input->post('caption')
);
} else {
$data = array(
'pubdate' => $this->input->post('pubdate'),
'enddate' => $this->input->post('enddate'),
'name' => $this->input->post('name'),
'image' => $image['file_name'],
'caption' => $this->input->post('caption')
);
}
$img = null;
//Check if a file is being uploaded/updated
if($_FILES['fieldname'][tmp_name] != ''){
//upload file here.....
$file = $this->upload->data();
$img = $file['file_name'];
}
//if no file name assigned to var, use the data stored in the model
//default_image.jpg
if(is_null($img)) $img = (string)$model->image;
-
`image` varchar(255) not null default 'default_image.jpg'
if($_FILES['image'][tmp_name] != '') will work fine...

Codeigniter- form with optional file uploading field working unexpectedly

I have a form which asks for user's name and description and an optional field of image uploading. When the user uploads the image I want the name of the image to be changed and stored into the database and if no image is uploaded then a default name is stored in the database. It works fine if user uploads an image but if he does not then nothing is being uploaded into the database.
This is the controller function :
function store()
{
$this->load->model('campus_m');
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png|jpeg';
$config['max_size'] = '100';
$config['max_width'] = '1024';
$config['max_height'] = '768';
$config['file_name'] = preg_replace('/[^a-z0-9]+/i','-',iconv('UTF-8','ASCII//TRANSLIT',$this->input->post('name')));
$config['file_name'] = trim($config['file_name'],'-').now().'.jpg';
$this->load->library('upload', $config);
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
$this->form_validation->set_rules('goods', 'Goods', 'required');
$this->form_validation->set_rules('name', 'Name', 'required|max_length[12]');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('campus_write_v');
}
else
{
print_r($_FILES['userfile']);
if (empty($_FILES['userfile'])) {
if(!$query = $this->campus_m->create_review("Marla-overdoses1360186300.jpg")){
$data['write_campus'] = 'The answer has not been stored.';
$this->load->view('campus_write_v', $data);
}
else {
$data['write_campus'] = 'The answer has been stored. ';
$this->load->view('campus_write_v', $data);
}
}
else
{
if($this->upload->do_upload()){
if(!$query = $this->campus_m->create_review($config['file_name'])){
$data['write_campus'] = 'The answer has not been stored.';
$this->load->view('campus_write_v', $data);
}
else {
$data['write_campus'] = 'The answer has been stored. ';
$this->load->view('campus_write_v', $data);
}
}
else
{
$error = array('error' => $this->upload->display_errors());
foreach ($error as $rows => $r)
{
echo $r ;
}
$this->load->view('campus_write_v');
}
}
}
}
And this is the view :
<?php
$attributes = array('id' => 'contactform');
echo form_open_multipart('campus/store', $attributes);
?>
<div>
<?php
echo form_label('Title of Area');
$data = array(
'name' => 'name',
'id' => 'name',
'placeholder' => 'Location and name of the place',
'required' => 'required',
'value' => set_value("name")
);
echo form_input($data);
?>
</div>
<div>
<?php
$data = array(
'name' => 'goods',
'id' => 'goods',
'placeholder' => 'Tell us about the place',
'required' => 'required',
'value' => set_value("goods"),
'rows' => '20',
'cols' => '50'
);
echo form_textarea($data);
?>
</div>
<div>
<input type="file" id="userfile" name="userfile" size="20" />
</div>
<div>
<?php
$data = array(
'class' => 'button',
'value' => 'Submit',
'id' =>"submit"
);
echo form_submit($data);
?>
</div>
<?php echo form_close();
?>
</div>
I will solve this in this way:
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$this->load->library('upload');
$this->upload->initialize($config);
if($this->upload->do_upload('userfile')){
$data = $this->upload->data();
$photo['image'] = $data['file_name']; // Name of image
} else {
$photo['image'] = "Name"; // Name that you want
}
This is the short code of uploads controller.

codeigniter upload image

Hello all im working on a admin system that can create news with a image but i cant find out how to send the image name from my model file to my controller,
this is my model file:
function uploadImg()
{
$config = array(
'allowed_types' => 'jpg|jpeg|gif|png',
'upload_path' => $this->gallery_path,
'max_size' => 2000,
'encrypt_name' => true
);
$this->load->library('upload', $config);
$this->upload->do_upload();
$image_data = $this->upload->data();
$config = array(
'source_image' => $image_data['full_path'],
'new_image' => $this->gallery_path . '/thumbs',
'maintain_ration' => true,
'width' => 200,
'height' => 200,
'encrypt_name' => true,
'max_size' => 2000
);
$this->load->library('image_lib', $config);
$this->image_lib->resize();
# Ret profil billed navn #
$file_array = $this->upload->data('file_name');
return $billed_sti['billed_sti'] = $file_array['file_name'];
//$this->db->where('username', $this->input->post('username'));
//$this->db->update('users', $profilBilledNavn);
}
This is my controller:
function opret() {
$this->form_validation->set_rules('overskrift', 'overskrift', 'required');
$this->form_validation->set_rules('description', 'description', 'required');
$this->form_validation->set_rules('indhold', 'indhold', 'required');
if($this->form_validation->run() == true)
{
$this->load->model('admin/nyheder_model');
$billed_sti = $this->nyheder_model->uploadImg();
$data = array(
'overskrift' => $this->input->post('overskrift'),
'description' => $this->input->post('description'),
'indhold' => $this->input->post('indhold'),
'billed_sti' => $billed_sti,
'brugernavn' => $this->session->userdata('username'),
'godkendt' => 'ja'
);
$this->db->insert('nyheder', $data);
redirect('admin/nyheder/index');
} else {
$this->index();
}
}
I do the image processing in the controller rather than the model.
"Models are PHP classes that are designed to work with information in your database."
from: http://codeigniter.com/user_guide/general/models.html
What you need to do is move the code for uploading the image to the controler.
function do_upload()
{
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '100';
$config['max_width'] = '1024';
$config['max_height'] = '768';
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload())
{
$error = array('error' => $this->upload->display_errors());
$this->load->view('upload_form', $error);
}
else
{
$data = array('upload_data' => $this->upload->data());
$this->load->view('upload_success', $data);
}
}
Once you did that,
You can insert the name of the file from the $data variable created in this line:
$data = array('upload_data' => $this->upload->data());
and you can get the value like this:
$data['file_name']
The file will upload the the folder you configured, and you will insert the filename to the DB From the controller.
I hope it helps.
Please use the upload function in your controller as the model classes are used to handle the database information. Please check the code below
//Controller Class
function upload_image()
{
//Check for the submit
// Submit Name refers to the name attribute on the submit input tag.
// $filename refers to the name attribute of the file input tag.
if($_SERVER['REQUEST_METHOD'] == "POST")
{
$submit = $this->input->post('submit');
if($submit == "Submit Name")
{
//Load the relevant classes and libraries
$this->load->library('upload');
$this->load->model('admin/nyheder_model','nmodel');
$filename = "image_file";
//Define the config array
$config = array();
$config['upload_path'] = $this->gallery_path;
$config['allowed_types'] = "jpg|gif|png";
$config['max_size'] = 0; //0 is for no limit
$this->upload->initalize($config);
if(!$this->upload->do_upload("$filename"))
{
echo $this->upload->display_errors();
}
else
{
$file_data = $this->upload->data();
$filename_1 = $file_data['file_name'];
$insert_array = array('filename'=>"$filename_1");
$this->nmodel->insert_data($insert_array);
} // end of the else statement
} // end of the isset statement
} // end of the outer conditional statement
Now you have the value of the filename in the $filename_1 variable which you can pass to the model class and can store the value in the database.
Thanks
J

Categories