Codeigniter validate_upload library can't upload file - php

I was referred to #raheel shan's thread on this page and use this My_Upload extended library to have if(!$this->upload->validate_upload('photo')) validation of input file, the validation is work fine if user try to upload invalid file type and the message is just shown in the right place.
Somehow, I can't upload image file to its folder and the filename is unable to save into table, there was works pretty to upload the image file and saved to table before I use this library.
Can someone please help with figure what's wrong in my code?
Controller:
public function index()
{
if(!$this->tank_auth->is_logged_in()) {
redirect('/auth/login');
}else{
$user_id = $this->session->userdata('user_id');
$profile = $this->users->get_profile_by_id($user_id);
$checked = $this->input->post('remove');
$this->form_validation->set_rules('name', 'Name', 'trim|required|xss_clean|min_length[5]|max_length[30]');
$this->form_validation->set_rules('country', 'Country', 'trim|required|xss_clean');
$this->form_validation->set_rules('website', 'Website', 'trim|xss_clean|max_length[30]');
if(isset($_FILES['photo']) AND !empty($_FILES['photo']['name'])) {
$this->form_validation->set_rules('photo', 'Photo', 'trim|callback_valid_upload');
if($this->upload->do_upload('photo')){
// image resizing
$config['source_image'] = $this->upload->upload_path.$this->upload->file_name;
$config['maintain_ratio'] = TRUE;
$config['width'] = 100;
$config['height'] = 100;
$this->load->library('image_lib', $config); //codeigniter default function
if(!$this->image_lib->resize()){
$this->session->set_flashdata('upload_msg', $this->image_lib->display_errors());
}else{
$image_data = $this->upload->data();
$photo_to_table = $image_data['file_name'];
}
}
}else{
if((int) $checked == 1){
unlink('./uploads/'.$profile->photo);
$photo_to_table = '';
}else{
$photo_to_table = $profile->photo;
}
//$photo_to_table = ((int) $checked == 1) ? '' : $profile->photo;
}
if($this->form_validation->run()) { // validation ok
if(!is_null($data = $this->tank_auth->update_user(
$this->form_validation->set_value('name'),
$this->form_validation->set_value('country'),
$this->form_validation->set_value('website'),
$photo_to_table
))) { // success
$this->session->set_flashdata('msg', 'Profile has been updated');
redirect(current_url());
}
}else{
$errors = $this->tank_auth->get_error_message();
foreach($errors as $k => $v) $data['errors'][$k] = $this->lang->line($v);
}
//blah blah..//load view
}
public function valid_upload()
{
$user_id = $this->session->userdata('user_id');
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|jpeg|png';
$config['max_size'] = '500';
$config['file_name'] = $user_id.'_'.strtotime('now');
$config['overwrite'] = TRUE;
$config['remove_spaces'] = TRUE;
//$this->load->library('upload', $config);
$this->upload->initialize($config);
if(!$this->upload->validate_upload('photo'))
{
$this->form_validation->set_message('valid_upload', $this->upload->display_errors());
return FALSE;
}else{
return TRUE;
}
}
}
Thanks.

I had a similar problem and in my case it was because I chose the wrong image library. Check your PHP installation for the appropriate image library you wish to use and make sure it matches. By default, CodeIgniter chooses GD2 (GD library versions >= 2) as the default image library.
http://ellislab.com/codeigniter/user-guide/libraries/image_lib.html
Try this:
// image resizing
$config['image_library'] = 'gd'; // specify the correct image library
$config['source_image'] = $this->upload->upload_path.$this->upload->file_name;
$config['maintain_ratio'] = TRUE;
$config['width'] = 100;
$config['height'] = 100;

What is your result in
$this->image_lib->display_errors()
Is your upload directory writable?
Do you have GD installed and active in php? Maybe try GD as Mahmoud suggested?

Related

Codeigniter - Two images upload did not work

I tried to upload two images using a form. To do that I wrote a image function.
protected function imageUploadResize($filename, $field_name, $width, $height, $maker){
// thumb image upload settings
$config['upload_path'] = './uploads/packages/';
$config['allowed_types'] = 'gif|jpg|png';
// thumb upload settings
$image_new_name = time().'_'.$filename;
$config['file_name'] = $image_new_name;
$this->load->library('upload', $config);
// upload thumb image
if ( $this->upload->do_upload($field_name)) {
// resize uploaded file
$config['image_library'] = 'gd2';
$config['source_image'] = './uploads/packages/'.$image_new_name;
$config['create_thumb'] = TRUE;
$config['maintain_ratio'] = TRUE;
$config['width'] = $width;
$config['height'] = $height;
$config['thumb_marker'] = $maker;
$this->load->library('image_lib', $config);
$this->image_lib->resize();
$error = array('error' => $this->upload->display_errors());
} else {
$imageData = array('upload_data' => $this->upload->data());
}
return $image_new_name;
}
And I access that function this way,
// allocate image name to data set
if(!empty($_FILES["thumb_image"]['name'])){
// thumb upload
$thumb_image_new_name = $this->imageUploadResize($_FILES["thumb_image"]['name'],'thumb_image',THUMB_IMAGE_WIDTH, THUMB_IMAGE_HEIGHT, '_thumb');
$data['thumb_image'] = $thumb_image_new_name;
}else{
$data['thumb_image'] = "";
}
// allocate image name to data set
if(!empty($_FILES["banner_image"]['name'])){
// banner upload
$banner_image_new_name = $this->imageUploadResize($_FILES["banner_image"]['name'],'banner_image',BANNER_IMAGE_WIDTH, BANNER_IMAGE_HEIGHT, '_banner');
$data['banner_image'] = $banner_image_new_name;
}else{
$data['banner_image'] = "";
}
When I upload one image (thumb_image or banner_image) above function is worked properly.
But when I upload both images thumb_image uploaded properly but banner_image did not upload properly. As a example assume I am going to upload Hydrangeas.jpg and Desert.jpg. Then it is working this way,
Then file uploaded this way (images names of the folder),
1493025280_Hydrangeas.jpg
1493025280_Hydrangeas_thumb.jpg
1493025280_Hydrangeas1.jpg - image name also wrong
But expected output is (images names of the folder),
1493025280_Hydrangeas.jpg
1493025280_Hydrangeas_thumb.jpg
1493025280_Desert.jpg
1493025280_Desert_banner.jpg
Can someone please help me, thank you..
A different approach that i use for file uploads is below.
I rearrange the $_FILES array because the original has some difficulties with keys and objects.
$files = array();
foreach ($_FILES['files']['name'] as $num_key => $dummy) {
foreach ($_FILES['files'] as $txt_key => $dummy) {
$files[$num_key][$txt_key] = $_FILES['files'][$txt_key][$num_key];
}
}
In new array, loop through each image and do what you need:
foreach ($files as $file) {
if ($file['error'] == 0) {
//Your code here...
//Call your function imageUploadResize
}
}
Finally found the solution, In codeigniter when upload image, we have to call,
$this->load->library('upload', $config);
Then we have to initialized the configurations.
$this->upload->initialize($config);
And when resize image we have to call,
$this->load->library('image_lib', $config);
Then have to initialized the configurations.
$this->image_lib->initialize($config);
Therefore completed function is,
protected function imageUploadResize($filename, $field_name, $width, $height, $maker){
// thumb image upload settings
$config['upload_path'] = './uploads/packages/';
$config['allowed_types'] = 'gif|jpg|png';
// thumb upload settings
$image_new_name = time().'_'.$filename;
$config['file_name'] = $image_new_name;
$this->load->library('upload', $config);
$this->upload->initialize($config);
// upload thumb image
if ( $this->upload->do_upload($field_name)) {
// resize uploaded file
$config['image_library'] = 'gd2';
$config['source_image'] = './uploads/packages/'.$image_new_name;
$config['create_thumb'] = TRUE;
$config['maintain_ratio'] = TRUE;
$config['width'] = $width;
$config['height'] = $height;
$config['thumb_marker'] = $maker;
$this->load->library('image_lib', $config);
$this->image_lib->initialize($config);
$this->image_lib->resize();
$error = array('error' => $this->upload->display_errors());
} else {
$imageData = array('upload_data' => $this->upload->data());
}
return $image_new_name;
}

Resize image and upload

I want to write a php code for resizing images that are retrieved from database and upload it in the site. But i can't resize the images. That are directly uploaded into site without resize.. My code is given below ..thanks in advance ...
public function editimg()`enter code here`
{
$config['image_library'] = 'gd2';
$id=$this->input->post('hiddenimgid');
$config['upload_path'] = './assets/img/movies';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '150';
$config['max_width'] = '199';
$config['max_height'] = '199';
//echo "hii";die;
// print_r($config);die;
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload())
{
//echo "not uploaded";die;
$error = array('error' => $this->upload->display_errors());
$data['message'] = "Image Cannot be Uploaded,Try Again !!";
$data['error']=$error;
$this->index_one($data);
} //if
else
{
//echo "hii";die;
$config['image_library'] = 'gd2';
$image_data = $this->upload->data();
$filename = $image_data['file_name'];
$source_path = 'assets/img/movies/'.$filename ;
$new_image_path = 'assets/img/movies/'.$image_data['raw_name'].'_thumb'.$image_data['file_ext']; //name of resized image
$target_path = 'assets/img/movies/';
$thumb['image_library'] = 'gd2';
$thumb['source_image'] = $source_path;
$thumb['new_image'] = $target_path;
$thumb['create_thumb'] = TRUE;
$thumb['maintain_ratio'] = TRUE;
$thumb['width'] = 140;
$thumb['height'] = 200;
//print_r($thumb);die;
//$this->load->library('image_lib', $config);
$this->load->library('image_lib', $thumb);
if ( !$this->image_lib->resize())
{
//echo "hii";die;
//$this->session->set_flashdata('errors', $this->image_lib->display_errors('', ''));
$this->session->set_flashdata('errors', $error= $this->image_lib->display_errors('', ''));
print_r($error);die;
}
else
{
//echo "hii";die;
//print_r($thumb);die;
$data=array(
'image'=>$new_image_path
);
//print_r($new_image_path);die;
if($this->movies_model->updateMovies($data,$id))
{
$data['message'] = "Movies added successfully !!";
//$this->index_one($data);
redirect("movies/index", 'refresh');
//print_r($thumb);die;
}
else
{
$data['message'] = "not_uploaded !!";
$this->index_one($data);
}
}
}
}
`
It simple to use Simple image
<?php
include('src/abeautifulsite/SimpleImage.php');
try {
$img = new abeautifulsite\SimpleImage('/*image name*/');
$img->resize(320, 200)->save('/*name of resize image*/');resize image and save resized image
} catch(Exception $e) {
echo 'Error: ' . $e->getMessage();
}
Oleh is correct, if you're struggling with image resizing it's best to use a library to handle all the edge cases and gotchas.
Here's how to do it with SimpleImage 2.x:
$image = new \abeautifulsite\SimpleImage('image.jpg');
$image->resize(320, 200)->save('result.jpg');
And SimpleImage 3.x:
$image = new \claviska\SimpleImage('image.jpg');
$image->resize(320, 200)->toFile('output.jpg');
The SimpleImage library can be installed with Composer:
composer require claviska/simpleimage
Or downloaded from GitHub and included manually.

Image resize not working in CodeIgniter 3

I am developing a web application. In my application, I am uploading an image to server and then resize it. I uploaded to server successfully. But when I resize image, it is not resizing image. But it is not throwing error as well.
This is my image file upload model
class file_helper extends CI_Model{
function __construct()
{
parent::__construct();
$this->load->library('image_lib');
}
function generateRandomFileName()
{
$rand = rand(10000,99999);
$file_name = time().$rand;
return time().$rand;
}
function uploadImage()
{
$name = $this->generateRandomFileName();
$config['upload_path'] = './'.UPLOAD_FOLDER.'/';
$config['allowed_types'] = 'gif|jpg|png|jpeg';
$config['file_name'] = $name;
$this->load->library('upload', $config);
if ( !$this->upload->do_upload('userfile'))
{
return FALSE;
}
else
{
$data = $this->upload->data();
$data['virtual_path'] = UPLOAD_FOLDER."/".$name.".".$data['file_ext'];
return $data;
}
}
function resizeImage($path)
{
$config['image_library'] = 'gd2';
$config['source_image'] = '/'.$path;
$config['create_thumb'] = TRUE;
$config['maintain_ratio'] = TRUE;
$config['width'] = 300;
$config['height'] = 50;
$this->load->library('image_lib', $config);
if ( ! $this->image_lib->resize())
{
print_r($this->image_lib->display_errors());
}
else{
echo "Ok";
}
}
}
As you can see in the model I print out "Ok" on success and print_r the error in failure. The path I passed is something like this "uploads/23344545.png". But that resize function always print out "Ok", but the image is not resized. What is wrong with my code?
You need to resize the image while uploading
function uploadImage()
{
$name = $this->generateRandomFileName();
$config['upload_path'] = './'.UPLOAD_FOLDER.'/';
$config['allowed_types'] = 'gif|jpg|png|jpeg';
$config['file_name'] = $name;
$config['width'] = 300;
$config['height'] = 50;
$this->load->library('upload', $config);
if ( !$this->upload->do_upload('userfile'))
{
return FALSE;
}
else
{
$data = $this->upload->data();
$data['virtual_path'] = UPLOAD_FOLDER."/".$name.".".$data['file_ext'];
return $data;
}
}

Codeigniter image manipulator Unable to save the image

Well i have the following problem:
I'm using CodeIgniter 2.1.3 and want to upload an image and create two scaled images. one that is resized to the size of around 50x50 and one that is resized to around 200x200.
Uploading is doing fine.
But when i want to resize the following error occures:
Unable to save the image. Please make sure the image and file directory are writable.
I've set my permission on the server to 777, but it still doesn't compute
Here is the code of the classes:
public function uploadimage()
{
$head = array('title' => 'Upload Image');
$error = array('error' => '');
$this->load->view('head',$head);
$this->load->view('imageUpload', $error);
$this->load->view('footer');
}
public function changeimage()
{
$config = array();
$config['upload_path'] = 'img/Upload';
$config['allowed_types'] = 'gif|jpg|jpeg|png|bmp';
$config['max_size'] = '100';
$config['max_width'] = '200';
$config['max_height'] = '200';
$config['overwrite'] = TRUE;
$config['file_name'] = md5($this->session->userdata('username')).".png";
$head = array('title' => 'Upload Image');
$this->upload->initialize($config);
if ( ! $this->upload->do_upload())
{
$error = array('error' => $this->upload->display_errors());
$this->load->view('head',$head);
$this->load->view('imageUpload', $error);
$this->load->view('footer');
}
else
{
$uploaddata = $this->upload->data();
//Create Thumb
$config2 = array();
$config2['image_library'] = 'gd';
$config2['source_image'] = $uploaddata['full_path'];
$config2['maintain_ratio'] = TRUE;
$config2['width'] = 50;
$config2['height'] = 50;
$config2['new_image'] = '/~3612546/DateSite/img/ProfileThumbs/'.$uploaddata['file_name'];
$this->image_lib->initialize($config2);
if ( ! $this->image_lib->resize())
{
echo $this->image_lib->display_errors();
}
//Create resized original image so images < 200x200 get resized to get as close to 200x200
$config3 = array();
$config3['image_library'] = 'gd';
$config3['source_image'] =$uploaddata['full_path'];
$config3['maintain_ratio'] = TRUE;
$config3['width'] = 200;
$config3['height'] = 200;
$config3['new_image'] = '/~3612546/DateSite/img/ProfileImages/'.$uploaddata['file_name'];
$this->image_lib->initialize($config3);
if ( ! $this->image_lib->resize())
{
echo $uploaddata['full_path'];
echo $this->image_lib->display_errors();
}
}
}
i really don't think tilde is good for upload urls:
/~3612546/DateSite/img/ProfileImages/
then, all your urls are upper/lowercase, put them all to lowercase like this:
/~3612546/dateSite/img/profileimages/
in the end post what error do you receive now that you chmod 777 your upload folder, do you added 777 only to dir or dir+all his content? (it's important dir+all his content to 777)

Codeigniter replace uploaded image

I'm using Codeigniter's File Uploading Class for uploading user avatars. Is there a way to replace a user's image file whenever he/she uploads a new one? I want to replace an existing avatar with the newest one uploaded.
My image uploading controller
function upload_avatar()
{
$config['upload_path'] = './uploads/avatars/';
$config['allowed_types'] = 'jpg|png';
$config['overwrite'] = FALSE; //overwrite user avatar
$config['encrypt_name'] = TRUE;
$config['max_size'] = '200'; //in KB
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload())
{
$error = $this->upload->display_errors();
$this->session->set_flashdata('error', $error);
redirect('/settings/avatar');
}
else
{
$config['image_library'] = 'gd2';
$config['source_image'] = $this->upload->upload_path.$this->upload->file_name;
$config['create_thumb'] = FALSE;
$config['maintain_ratio'] = FALSE;
$config['width'] = 120;
$config['height'] = 120;
$this->load->library('image_lib', $config);
$this->image_lib->crop();
//Add image path to database
$avatar_path = 'uploads/avatars/' . $this->upload->file_name;
$user_id = $this->tank_auth->get_user_id();
$this->Settings_model->update_avatar($avatar_path, $user_id);
$this->session->set_flashdata('success', 'Avatar updated!');
redirect('/settings/avatar');
}
}
There is a public attribute overwrite that dictates the decision to overwrite the original file. By default, a new filename is created based on the original. Here's the source from Upload.php in CI:
/*
* Validate the file name
* This function appends an number onto the end of
* the file if one with the same name already exists.
* If it returns false there was a problem.
*/
$this->orig_name = $this->file_name;
if ($this->overwrite == FALSE)
{
$this->file_name = $this->set_filename($this->upload_path, $this->file_name);
if ($this->file_name === FALSE)
{
return FALSE;
}
}
So all you need to do to get the overwrite working is:
$this->load->library('upload', $config);
$this->upload->overwrite = true;
Simple set "overide" be true in your config.
$this->upload->initialize(array(
"upload_path"=>$path,
"allowed_types"=>"jpg|png|jpeg",
"overwrite"=>true
));
did you try to change
$config['overwrite'] = FALSE;
to
$config['overwrite'] = TRUE;

Categories