codeigniter do_upload not working - php

I'm trying to add a file upload function in my website using codeigniter's upload library.
here's my view file (display.php):
<html>
<body>
<form method="post" action="" enctype="multipart/form-data">
<input type="file" name="filename" />
<input type="submit" name="submit" id="submit" value="submit"/>
</form>
</body>
</html>
and here's the controller:
public function testupload()
{
if ( ! empty($_FILES))
{
echo 'start upload';
$config['upload_path'] = './assets/img/tempfile/';
$this->load->library('upload');
$this->upload->initialize($config);
if ( ! $this->upload->do_upload('filename'))
{
echo 'error!';
}
else
{
echo 'success!';
}
echo 'end upload';
}
$this->load->view('display', $this->data);
}
but the code seems to stop after $this->upload->initialize($config); the file was not uploaded, and there was no message at all. only the 'start upload' message appeared; the echo 'success' , echo 'error' , and echo 'end upload' do not appear.
why is that? can anyone help me??

Late from party, but maybe this can help somebody with same problem. Please try this:
Views:
<?php echo form_open_multipart('test/upload');?>
<input type="file" name="photo">
<?php echo form_close();?>
Controller:
class Test extends CI_Controller {
function upload() {
$config = array(
'upload_path' => './assets/upload/',
'allowed_types'=> 'gif|jpg|png',
'encrypt_name' => TRUE // Optional, you can add more options as need
);
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload('photo')) {
echo '<pre>';
print_r($this->upload->display_errors());
exit();
} else {
echo '<pre>';
print_r($this->upload->data());
exit();
}
}
}
Inside views i recomended use this function form_open_multipart('ctrl/method') but if you prefer using HTML5 forms, just be sure correct the attributes in form like this.
<form action="<?=site_url('ctrl/method')?>" enctype="multipart/form-data" method="post" accept-charset="utf-8">
<input type="file" name="photo">
</form>
More preferences in $config['..'] can you find in documentation CodeIgniter https://codeigniter.com/user_guide/libraries/file_uploading.html

Try like this....
public function testupload()
{
if ( ! empty($_FILES))
{
echo 'start upload';
$config['upload_path'] = './assets/img/tempfile/';
$this->load->library('upload',$config);
if ( ! $this->upload->do_upload('filename'))
{
$error = array('error' => $this->upload->display_errors());
$this->load->view('display', $error); //loads the view display.php with error
}
else
{
echo 'success!';
}
echo 'end upload';
$data = array('upload_data' => $this->upload->data());
$this->load->view('display', $data); //loads view display.php with data
}
}

change from
$config['upload_path'] = './assets/img/tempfile/';
to
$config['upload_path'] = 'assets/img/tempfile/';

i check this code this work perfect
simply add this line
$config['allowed_types'] = 'png|gif|jpg|jpeg';
$config['max_size'] = '7000';
after this
$config['upload_path'] = './assets/img/tempfile/';
or you can also set this in view page
action="<?php echo base_url('YourController/testupload');?>"

this is due to php server version and it's option.
1).go to cpanel account
2).click "select php version", in the software section.
3).tap the "fileinfo" chexbox in the php option and save.
now you can upload file perfectly.

Same issue as described. I have fixed it using the following: Open the file system/libraries/Upload.php go to function validate_upload_path() and add the command return TRUE; as a last line inside this function. Save and try again.

use this for image upload:
$valid_extensions = array('jpeg', 'jpg', 'png');
if ($_FILES['filename']['error'] == 0) {
$img = $_FILES['filename']['name'];
$tmp = $_FILES['filename']['tmp_name'];
$ext = strtolower(pathinfo($img, PATHINFO_EXTENSION));
if (in_array($ext, $valid_extensions)) {
$path = "./assets/img/tempfile/" . strtolower($img);
if (move_uploaded_file($tmp, $path)) {
$_POST['filename'] = $path;
}
}
}
use insert query to insert file :
$this->db->insert('table_name', $_POST);

Having the same problem on macOS. It seems that if you are not the "main" user of your laptop/pc, the default permission is "Read Only". You must change it to "Read & Write".
Right click on the folder
Get Info
Sharing and permissions
Change 'Read Only' to 'Read & Write'

add allowed file type parameter in config
$config['allowed_types'] = 'gif|jpg|png';

your code is missing the following,
$this->load->library('upload',$config);
Recorrect it by rewriting the above code.

Related

How to upload Images in codeigniter with mysql database

Note is that : All data is inserted properly.
But if i'm upload an image with the help of
$this->upload->do_upload();and validate id,
this is not properly working. can u suggest..
//Controller
public function saveEmployeea()
{
$config = [ 'upload_path'=>'./uploads',
'allowed_types'=>'gif|jpg|png|jpeg'];
$this->load->library('upload', $config);
$this->form_validation->set_rules('dept_name', 'Department', 'required');
$this->form_validation->set_rules('firstname', 'First Name','required');
$this->form_validation->set_rules('middlename', 'Middle Name','required');
$this->form_validation->set_rules('lastname', 'Last Name','required');
$this->form_validation->set_rules('gendar', 'Gendar','required');
$this->form_validation->set_rules('address1', 'Local Address','required');
$this->form_validation->set_rules('address2', 'Permant Address','required');
$this->form_validation->set_rules('nationality', 'Nationality','required');
$this->form_validation->set_rules('date_of_joining', 'Joinig Date','required');
$this->form_validation->set_rules('current_designation', 'Designation_Curnt','required');
// $this->form_validation->set_rules('profile_image', 'Please Upload image','required');
$this->form_validation->set_rules('prof_email_id', 'Professional Email Id','required|valid_email');
$this->form_validation->set_rules('personal_email', 'Personal Email Id','required|valid_email');
$this->form_validation->set_rules('personal_no', 'Personal Contact No','required');
$this->form_validation->set_rules('emergency_no', 'Emergency No','required');
$this->form_validation->set_rules('highest_qualification', 'Highest Qualificatio','required');
$this->form_validation->set_rules('year_of_passing', 'Year Of Passing','required');
$this->form_validation->set_rules('university', 'University','required');
$this->form_validation->set_rules('no_experience', 'No Experience','required');
$this->form_validation->set_rules('pre_compony', 'Previus Compony','required');
$this->form_validation->set_rules('pre_designation', 'Previus Designation','required');
$this->form_validation->set_rules('pre_organisation_location', 'Previus organisation_location','required');
if ( $this->form_validation->run() && $this->upload->do_upload())
{
$data = $this->input->post();
// insert images in data variables by using upload object oprater.
$upload_info = $this->upload->data();
//set path for images store
$path = base_url("uploads/".$upload_info['raw_name'].$upload_info['file_ext']);
$data['profile_image'] = $path;
// echo '<pre>';
// print_r($data);
// echo '</pre>';
// var_dump($data);
// exit();
// Load Model to Call Model class
$this->load->model('Loginm');
if($this->Loginm->insertEmployee($data))
{
$this->session->set_flashdata('employee_details','Employee Details Added Successfully');
}
else
{
$this->session->set_flashdata('employee_details','Failed To Added Employee Details.');
}
return redirect('Employee/EmployeeList');
}
else
{
$upload_error = $this->upload->display_errors();
$this->createEmployee();
}
}
// Model
public function insertEmployee($data)
{
return $this->db->insert('employee',$data);
}`enter code here`
Try this code
$config['upload_path'] = 'd:/www/project_name/uploads/'; //document root path
$config['allowed_types'] = 'jpg|gif|png';
$config['file_name'] = $_FILES['profile_image']['name'];
//load upload class library
$this->load->library('upload', $config);
if (!$this->upload->do_upload('profile_image'))
{
// case - failure
echo $this->upload->display_errors();
}
else
{
// case - SUCCESS
}
First,
$this->upload->do_upload('userfile')
here 'userfile' in the name attribute in the input element.
<form action="url" enctype="multipart/form-data" method="post">
<input type="file" name="userfile" accept="image/*">
make sure you use:
enctype="multipart/form-data"
or
CI 3 counterpart:
echo form_open_multipart();
second,
The Upload Directory
You’ll need a destination directory for your uploaded images. Create a directory at the root of your CodeIgniter installation called uploads and set its file permissions to 777.
you may have file permission issue in the upload directory that you set. You should set proper permissions to the upload directory.
References:
https://www.codeigniter.com/userguide3/libraries/file_uploading.html

Is there a better way of multipart/form-data validation

I have a multipart/form-data with an image upload and some personal data, so I want to include file upload in form validation, I can successfully do this.
However, I now find that there is an issue, ie even if my other form fields have errors and upload file field with no error, then image uploads to folder, how to prevent this, I mean, in my case, If name, email, file fields validation is ok then only file should upload, if name filed validation fails and file field validation ok then file should not upload
here is the code I use:
In Controller:
<?php
public $_rules = array(
'name'=>array('field'=>'name', 'label'=>'Name', 'rules'=>'trim|required'),
'email'=>array('field'=>'email', 'label'=>'Email', 'rules'=>'trim|required|valid_email'),
'profile_img'=>array('field'=>'profile_img', 'label'=>'Design', 'rules'=>'callback__profile_upload')
);
public function profile()
{
$this->load->library('upload');
$rules = $this->_rules;
$this->form_validation->set_rules($rules);
if($this->form_validation->run()==TRUE){
die('success');
}else {
$this->data['content'] = 'frontend/pages/place_order';
$this->load->view('frontend/_layout_main', $this->data);
}
}
function _profile_upload(){
if($_FILES['profile_img']['size'] != 0 && !empty($_FILES['profile_img']) ){
$upload_dir = './profile_pics/';
if (!is_dir($upload_dir)) {
mkdir($upload_dir);
}
$config['upload_path'] = $upload_dir;
$config['allowed_types'] = 'gif|jpg|png|jpeg';
$config['file_name'] = 'profile_img_'.substr(md5(rand()),0,7);
$config['overwrite'] = false;
$config['max_size'] = '5120';
$this->upload->initialize($config);
if (!$this->upload->do_upload('profile_img')){
$this->form_validation->set_message('_profile_upload', $this->upload->display_errors());
return false;
}
else{
$this->upload_data['file'] = $this->upload->data();
return true;
}
}
else{
$this->form_validation->set_message('_profile_upload', "No file selected");
return false;
}
}
IN VIEW:
<?php echo form_open_multipart();?>
<?php $name_err = (!empty(form_error('name'))) ? 'err' : ' ';
echo form_input('name',set_value('name'), array('placeholder'=>'Name','class'=>" {$name_err } "));
?>
<?php $email_err = (!empty(form_error('email'))) ? 'err' : ' ';
echo form_input('email',set_value('email'), array('placeholder'=>'EMail','class'=>" {$email_err } "));
?>
<?php
echo form_error('profile_img');
echo form_upload(array('name' =>'profile_img', 'class' => 'inputfile inputfile-4', 'id' => 'profile_img'));
?>
<li><input type="submit" class="special" value="Submit" /></li>
Try once like this.I think for images not need to set rules like other fields.
public $_rules = array(
'name'=>array('field'=>'name', 'label'=>'Name', 'rules'=>'trim|required'),
'email'=>array('field'=>'email', 'label'=>'Email', 'rules'=>'trim|required|valid_email'),
);
And
public function profile()
{
$this->load->library('upload');
$rules = $this->_rules;
$this->form_validation->set_rules($rules);
if($this->form_validation->run()==TRUE){
die('success');
}else {
if ($this->_profile_upload()) { //return true if file uploaded successfully otherwise error
$this->data['content'] = 'frontend/pages/place_order';
$this->load->view('frontend/_layout_main', $this->data);
}
}
}
yes that is very obvious that your file get uploads even any other fields' validation failed. You have to initiate image uploading only after form validation success.
For that simply validate file specific requirement in that callback, and do actual uploads after successful form validation.
I have got a solution from codexWorld, I have asked same question over there, and they replied with a tutorial, If anybody still looking for a solution here is the link
http://www.codexworld.com/codeigniter-file-upload-validation/
in the validation call back, we just want to do the file type check
public function _profile_upload($str){
$allowed_mime_type_arr = array('image/jpeg','image/pjpeg','image/png','image/x-png');
$mime = get_mime_by_extension($_FILES['file']['name']);
if(isset($_FILES['file']['name']) && $_FILES['file']['name']!=""){
if(in_array($mime, $allowed_mime_type_arr)){
return true;
}else{
$this->form_validation->set_message('_profile_upload', 'Please select only pdf/gif/jpg/png file.');
return false;
}
}else{
$this->form_validation->set_message('_profile_upload', 'Please choose a file to upload.');
return false;
}
}
and in the main function we just want to do the same as normal, using do_upload and specifying the upload config items, anyhow there will be a second file type check when the function executes, I think that doesn't matter. The code will look like this::
public function profile()
{
$rules = $this->_rules;
$this->form_validation->set_rules($rules);
if($this->form_validation->run()==TRUE){
$config['upload_path'] = 'uploads/files/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 1024;
$this->load->library('upload', $config);
//upload file to directory
if($this->upload->do_upload('file')){
$uploadData = $this->upload->data();
$uploadedFile = $uploadData['file_name'];
/*
*insert file information into the database
*.......
*/
}else{
$data['error_msg'] = $this->upload->display_errors();
}
}else {
$this->data['content'] = 'frontend/pages/place_order';
$this->load->view('frontend/_layout_main', $this->data);
}
}

Update picture/image in Codeigniter

I'm trying to create update image for user who want to change their photo.The when i click submit on photo upload, there is no photo uploaded and photo's column still no update.
Here is my Contorller:
function foto($id='')
{
$data['data'] = $this->user_model->get_foto($id);
$data['form_action'] = site_url("user/update_foto/$id");
$this->load->view('user/foto_form', $data);
}
function update_foto($id=''){
$this->user_model->update_foto($id);
}
Here is My model:
function get_foto($id=0){
$id = $this->session->userdata('id');
$sql = "SELECT id,foto FROM user WHERE id= '$id'";
$query = $this->db->query($sql);
$data = $query->row_array();
return $data;
}
function update_foto(){
$config['upload_path'] = './upload/';
$config['allowed_types'] = 'jpg|png|jpeg';
$this->load->library('upload', $config);
if (!$this->upload->do_upload('foto'))
{
$id_user=$this->session->userdata('id');
redirect ("user/foto/$id_user");
} else {
$id_user=$this->session->userdata('id');
$data=array(
'foto'=>$this->input->post('foto')
);
$this->db->where('id',$id_user);
$this->db->update('user',$data);
redirect("user");
}
}
And this is my upload form on view:
<form role="form" action="<?php echo $form_action ?>" class="form-horizontal style-form" method="POST" enctype="multipart/form-data">
<label >Upload Foto</label>
<input type="file" name="foto"/>
<button type="submit">Save</button>
</form>
Any Answer? Many thanks for the answer...
On your controller try replacing this
from
site_url("user/update_foto/$id");
to
site_url("user/update_foto") ./. $id;
Or you could use uri segment refer user guide.
site_url("user/update_foto") ./. $this->uri->segment(4); // unsure id check uri segment in url.
Your route may need to be changed
$route['user/update_foto/(:any)'] = "controllername/foto/$1";
All ways make sure the controller has index()
At your model this is wrong.
$data=array(
'foto'=>$this->input->post('foto')
);
$this->input->post('foto') does not get your file name.
You can try that with this
else {
$id_user=$this->session->userdata('id');
$info=$this->upload->data();
$data=array(
'foto'=>$info['file_name']
);
$this->db->where('id',$id_user);
$this->db->update('user',$data);
redirect("user");
}
better use this line for your upload path
$config['upload_path'] = FCPATH.'upload/';
$file_name = "";
if ($_FILES['foto']['error']!= 4) {
$fileParts = pathinfo($_FILES['foto']['name']);
$file_name = time() . '.' . $fileParts['extension'];
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png|jpeg';
$config['file_name'] = $file_name;
$this->load->library('upload', $config);
$this->upload->initialize($config);
$this->upload->do_upload('foto');
}

how to submit file using jquery to codeigniter controller

May I ask for your help guys!
I am trying to upload a file and passing all the data to codeigniter controller using jquery.
my view file:
<div class="form-group">
<label class="col-md-4 control-label">Item Image</label>
<div class="col-md-8">
<input class="form-control" type="file" placeholder="" id="itemImage" name="itemImage" data-parsley-required="true" />
</div>
</div>
<button type="button" onclick="add_item();">Sumit</button>
<script>
function add_item(){
$.post('<?php echo site_url('admin_newitem/add_item'); ?>',
{
itemId : $('#itemId').val(),
itemImage : $('#itemImage').val()
},
function(data){
if(data.result=='SUCCESS'){
$('#itemId').val('');
$('#itemImage').val('');
//show success
}else{
//show error
}
},'json'
);
}
</script>
My controller:
function add_item(){
$this->output->set_status_header(200);
$this->output->set_header('Content-Type: application/json');
$itemId = $this->input->post('itemId');
$itemImage = $this->input->post('itemImage');;
$config['upload_path'] = realpath(APPPATH.'../assets_main/img/item/');
$config['allowed_types'] = 'jpg|jpeg';
$config['max_size'] = '100';
$config['max_width'] = '200';
$config['max_height'] = '200';
$file_name = $config['file_name'] = md5(uniqid(mt_rand()));
$config['remove_spaces'] = TRUE;
$this->load->library('upload', $config);
if(!$itemImage){
$jdata['result'] = "FAILED";
$jdata['message'] = "upload error.";
$jdata['field'] = "itemImage";
echo json_encode($jdata);
exit();
}
$data = array('upload_data' => $this->upload->data());
$jdata['message'] = "Thank you for purchasing our item!";
$jdata['result'] = "SUCCESS";
echo json_encode($jdata);
exit();
}
I was able to get the ItemId, and ItemImage but when I check the folder where the image is suppose to be located, it's not there. I think I fail to capture the real file, so, is there a way for me to get this done?
As you suggest, I believe that you are forgetting to actually do the upload, the code igniter documentation might help:
http://www.codeigniter.com/user_guide/libraries/file_uploading.html
With this correctly implemented, I think your code should look something similar to:
function add_item(){
$this->output->set_status_header(200);
$this->output->set_header('Content-Type: application/json');
$itemId = $this->input->post('itemId');
$itemImage = $this->input->post('itemImage');;
$config['upload_path'] = realpath(APPPATH.'../assets_main/img/item/');
$config['allowed_types'] = 'jpg|jpeg';
$config['max_size'] = '100';
$config['max_width'] = '200';
$config['max_height'] = '200';
$file_name = $config['file_name'] = md5(uniqid(mt_rand()));
$config['remove_spaces'] = TRUE;
$this->load->library('upload', $config);
//THE MISSING LINE
if($this->upload->do_upload()){
//THE FILE HAS NOW BEEN UPLOADED
$data = array('upload_data' => $this->upload->data());
$jdata['message'] = "Thank you for purchasing our item!";
$jdata['result'] = "SUCCESS";
echo json_encode($jdata);
exit();
}else{
//NO FILE UPLOADED
$jdata['result'] = "FAILED";
$jdata['message'] = "upload error.";
$jdata['field'] = "itemImage";
echo json_encode($jdata);
exit();
}
}
My initial thinking, having used CI and tried to do this same thing, is that you can't do file uploads via AJAX without a special plugin such as this:
http://malsup.com/jquery/form/
Specifically, this file upload portion:
http://malsup.com/jquery/form/#file-upload
Simply trying to send a post with the val of a file input will not work, I don't believe - though maybe more modern browsers are able to handle that now.

want to store multiple file path in database

Hi i want to store multiple file path in database, but the following code is storing just one file path
Kindly some one help.
My Controller
<?php
class upload extends CI_Controller {
function __construct()
{
parent::__construct();
$this->load->helper(array('form', 'url'));
}
function index()
{
$this->load->view("header.php");
$this->load->view('main_views', array('error' => ' ' ));
$this->load->view("footer.php");
}
function do_upload()
{
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '2000';
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload())
{
// no file uploaded or failed upload
$error = array('error' => $this->upload->display_errors());
$this->load->view("header.php");
$this->load->view('main_views', $error);
$this->load->view("footer.php");
}
else
{
$data = array('upload_data' => $this->upload->data());
$this->load->model('post_model');
$this->post_model->main_model();
$this->load->view("header.php");
$this->load->view('main_views');
$this->load->view("footer.php");
}
}
?>
My Model
<?php
class post_model extends CI_Model
{
function main_model()
{
$filepath = $this->upload->data()['file_name'];
$this->db->trans_begin();
$this->db->query("insert into post (post_pic)
values ('$filepath')");
$ad_id = $this->db->insert_id();
}
}
?>
Views
<span id="filediv"><input name="userfile" type="file" id="file"/>
</span>
<span id="filediv"><input name="userfile2" type="file" id="file"/>
</span>
<span id="filediv"><input name="userfile3" type="file" id="file"/>
</span>
<span id="filediv"><input name="userfile2" type="file" id="file"/></span><br/>
extra text due to parsing rule kindly ignore it extra text due to parsing rule kindly ignore it extra text due to parsing rule kindly ignore it extra text due to parsing rule kindly ignore it extra text due to parsing rule kindly ignore it
Views
- input name change to name="userfile[]"
You can use multiple upload of codeignter
https://github.com/stvnthomas/CodeIgniter-Multi-Upload
Thanks
You have to upload each $_FILES
foreach ( $_FILES as $key => $value ) {
if (! empty ( $value ['name'] )) {
//change the file name
$config ['file_name'] = date('Y_m_d') . '_' . $value ['name'];
$this->upload->initialize($config);
if (! $this->upload->do_upload ( $key )) {
// handle error function
$this->handle_error ( $this->upload->display_errors () );
} else {
$files [$i] = $this->upload->data ();
++ $i;
}
}
}
Here in $files array you will get the details of the uploaded files which can be used further for model to insert into database the path of the files.

Categories