I am trying to create thumbnails original image is been uploaded to upload/large
but not thumbnails are created in upload/thumbs I was using the CodeIgniter Image Manipulation Class and it's not working.Help me to sort out problem
My Controller
var $file_path; //for original image
var $file_path_url; //for thumbnails
function __construct()
{
// Call the Model constructor
parent::__construct();
$this->load->library('session');
$this->is_login();
$this->load->helper(array('form', 'url'));
$this->load->model('Edit_profile');
//return full path of directory
//Make sure these directory have read and write permission
$this->file_path = realpath(APPPATH . '../upload/large');
$this->file_path_url = realpath(APPPATH.'../upload/thumbs');
// $this->load->model('Insert_article');
}
function upload()
{
//loading image class
$session_data = $this->session->userdata('sessiondata');
$user_id = $session_data['user_id'];
//post image
$img=$this->input->post("filename");
//set preferences
$config['remove_spaces']=TRUE;
$config['encrypt_name'] = TRUE; // for encrypting the name
$config['upload_path'] = LARGEPATH;
$config['allowed_types'] = 'jpg|png|gif';
$config['max_size'] = '78000';
//load moadel ********
$this->load->model('Edit_profile');
//load upload class library
$this->load->library('upload', $config);
//$this->upload->do_upload('filename') will upload selected file to destiny folder
if (!$this->upload->do_upload('filename'))
{
// case - failure
$upload_error = array('error' => $this->upload->display_errors());
$this->load->view('edit_profile', $upload_error);
}
else
{
// case - success
//callback returns an array of data related to the uploaded file like the file name, path, size etc
$upload_data = $this->upload->data();
// call to model function *********
$data['images'] = $this->Edit_profile->insert_new_post($upload_data);
//now creating thumbnails
$config1 = array(
'source_image' => $upload_data['full_path'],
'create_thumb' =>true,
'overwrite' =>false,
'maintain_ratio' =>true,
'new_image' => $this->file_path_url,
'maintain_ratio' => true,
'width' => 36,
'height' => 36
);
print_r($config1);
$this->load->library('image_lib');
$this->image_lib->initialize($config1);
$this->image_lib->resize();
//here is the second thumbnail, notice the call for the initialize() function again
//$this->image_lib->initialize($config);
//$this->image_lib->resize();
$data['success_msg'] = '<div class="alert alert-success text-center">Your file <strong>' . '</strong> was successfully uploaded!</div>';
redirect(base_url("Display_profilepic/index"));
}
}
//Model
function insert_new_post($upload_data)
{
$session_data = $this->session->userdata('sessiondata');
$user_id = $session_data['user_id'];
$filePath = ltrim(LARGEPATH.$upload_data['file_name'],'.');
//print_r(LARGEPATH);
$query = "UPDATE `tbl_usrs` set profile_picture='".$filePath."' where user_id='".$user_id."'";
// $this->db->query($query,array($img));
$arg=array ($upload_data);
if($this->db->query($query,$arg)==true)
{
return true; // if added to database
}else {
return false;
}
}
Please update the new_image value by including the filename also.
$config1 = array(
'image_library'=>'gd2',
'source_image' => $upload_data['full_path'],
'create_thumb' =>true,
'overwrite' =>false,
'maintain_ratio' =>true,
'new_image' => $this->file_path_url.'/'.$upload_data['file_name'], //add slash
'maintain_ratio' => true,
'width' => 36,
'height' => 36
);
Try to use the following code
$data = $this->upload->data(); $this->thumb($data);
//Function for creating Thumbnails
function thumb($data) {
$config['image_library'] = 'gd2';
$config['source_image'] = $data['full_path'];
$config['create_thumb'] = TRUE;
// $config['maintain_ratio'] = TRUE;
$config['width'] = 350;
$config['height'] = 250;
$this->load->library('image_lib');
$this->image_lib->initialize($config);
$this->image_lib->resize();
$this->image_lib->clear();
return true;
}
Related
I have this controller which inserts the images to upload folder without resizing them.
public Function Upload() {
$this->load->library('upload');
$config['upload_path'] = FCPATH . 'uploads/property-images';
$config['allowed_types'] = 'gif|jpg|png';
$config['file_name'] = 'property_image_1';
$config['max_size'] = '0';
$config['overwrite'] = FALSE;
for ($i = 0; $i < $number_of_files; $i++) {
$_FILES['uploadedimage']['name'] = $files['name'][$i];
$_FILES['uploadedimage']['type'] = $files['type'][$i];
$_FILES['uploadedimage']['tmp_name'] = $files['tmp_name'][$i];
$_FILES['uploadedimage']['error'] = $files['error'][$i];
$_FILES['uploadedimage']['size'] = $files['size'][$i];
$this->upload->initialize($config);
if ($this->upload->do_upload('uploadedimage', $i)) {
$data['uploadedimage'] = $this->upload->data();
$image_name[$i] = $data['uploadedimage']['file_name'];
//$this->_property_images_resize($data); // Private Function For Resize
$data['images'] = implode(',',$image_name);
$this->model_users->insert_property_details($data))
redirect('view');
} else {
$this->form_validation->set_message('fileupload_check', $this->upload->display_errors());
return FALSE;
}
}
}
I further needed to resize the images with the help of a private function in controller:
private function _property_images_resize($data) {
$this->load->library('image_lib');
$config = array(
'image_library' => 'gd2',
'source_image' => 'uploads/property-images/'.$data['uploadedimage']['file_name'],
'new_image' => 'uploads/profile/test1/',
'create_thumb' => TRUE,
'maintain_ratio' => TRUE,
'width' => 10,
'height' => 10
);
$this->image_lib->initialize($config);
if(!$this->image_lib->resize()) echo $this->image_lib->display_errors();
}
After adding this second function, it changes nothing. Images uploads the way they were before without resizing.
Looking for someone's help as can't figure it out.
For validation Callback
function if_image_was_selected(){
$this->form_validation->set_message('if_image_was_selected', 'Please select at least 1 image in jpg/jpeg/png/gif format.');
$number_of_files = count($_FILES['uploadedimages']['tmp_name']);
$files = $_FILES['uploadedimages'];
for($i=0;$i<$number_of_files;$i++) {
if($_FILES['uploadedimages']['error'][$i] != 0) {
return false;
}else{
return true;
}
}
}
Are you sure your not suppose to call:
$this->load->library('image_lib', $config);
instead of
$this->image_lib->initialize($config);
Does your webserver user have write permissions to the uploads/profile/test1/ directory?
Do you get any error message? Have you checked the PHP log or Apache log?
Try adding this code below, above your code to see the error echo'd out to the screen if you can.
error_reporting(E_ALL);
ini_set("display_errors", 1);
I am trying to create a profile thumbnail for user when he upload a profile picture. I amlooking from some assistance here as recently put my hand on Codeiniter and I am new to php too.
Currently this inserts the profile image to 'temp' folder but doesn't resize it. I may be doing it wrong. Do I have to create a new function for thumbnail or I can include it along with the one I have?
I have no problem with adding a new profile picture. replacing the picture and deleting the profile picture automatically when new one is added. Just the resizing(thumbnail) of image.
Here is controller:
public function profile_image() {
if($this->session->userdata('is_logged_in')){
$username = $this->session->userdata('v_member_username');
$url1 = $this->my_profile_model->see_if_old_image_exists($username);
if (empty($_FILES['profile_image']['tmp_name'])) {
return true;
}else{
$url2 = $this->do_upload();
$this->my_profile_model->update_profile_image($url2, $username);
if(!empty($url1)){
$this->my_profile_model->delete_old_profile_image($url1);
}
}
}
}
private function do_upload() {
$type = explode('.', $_FILES['profile_image']['name']);
$type = $type[count($type)-1];
$filename = uniqid(rand()).'.'.$type;
$url2 = './uploads/temp/'.$filename;
if(in_array($type, array('jpeg', 'gif', 'png', 'jpg')))
if (empty($_FILES['profile_image']['tmp_name'])) {
return TRUE;
}else{
if(is_uploaded_file($_FILES['profile_image']['tmp_name']))
if(move_uploaded_file($_FILES['profile_image']['tmp_name'], $url2));
return $url2;
return '';
// do_thumb
$this->load->library('image_lib');
$source_path = $_SERVER['DOCUMENT_ROOT'] . 'uploads/temp/' . $filename;
$target_path = $_SERVER['DOCUMENT_ROOT'] . 'uploads/profile/';
$config_manip = array(
'image_library' => 'gd2',
'source_image' => $source_path,
'new_image' => $target_path,
'maintain_ratio' => TRUE,
'create_thumb' => TRUE,
'thumb_marker' => '_thumb',
'width' => 270,
'height' => 263
);
$this->load->library('image_lib', $config_manip);
if (!$this->image_lib->resize()) {
echo $this->image_lib->display_errors();
}
// clear //
$this->image_lib->clear();
}
}
And my model is:
// Update profile Image
function update_profile_image($url2, $username){
$this->db->set('profile_image', $url2);
$this->db->where('v_member_username', $username);
$this->db->update('vbc_registered_members');
}
// Look If There Was Any Old Image Earlier
function see_if_old_image_exists($username) {
$this->db->select('profile_image');
$this->db->from('vbc_registered_members');
$this->db->where('v_member_username', $username);
$query = $this->db->get();
$query_result = $query->result();
$row = $query_result[0];
return $row->profile_image;
}
// Auto Delete profile Image From Upload Folder On Updating New Image
function delete_old_profile_image($url1) {
unlink($url1);
return TRUE;
}
Please advise.
Codeigniter provides a library for uploading data.
see File Upload Library and Image Library
This is the code I use for uploading images, creating a thumbnail + resizing the image
/*
* This function returns the path of imagemagick on your system
*/
public static function getLibPath()
{
if(strlen(self::$_lib_path)==0)
{
self::$_lib_path=exec("/bin/bash -lc '/usr/bin/which convert'",$out,$rcode);
}
return self::$_lib_path;
}
/*
* This function handles the upload and calls the resizeImage function
* to generate the thumbnail and the resized image
*/
public function update()
{
$config['upload_path'] = 'your upload path';
$config['allowed_types'] = 'jpg|png|bmp';
$config['max_size'] = '8192';//8mb //4096kb - 4mb
$config['max_width'] = '0';
$config['max_height'] = '0';
$config['overwrite'] = false;
$config['encrypt_name']=true;//this generates a filename for you
$this->load->library('upload', $config);
$result = $this->upload->do_upload();
if($result) {
$fileInfo=$this->upload->data();
$this->resizeImage($fileInfo['full_path']);
$data = array(
'filename' => $fileInfo['file_name'],
'orig_file_name' =>$fileInfo['orig_name'],
);
//pseudo function for storing the file info
save_metadata_to_db($data);
}
else
{
echo $this->upload->display_errors());
}
}
/*
* This function creates a thumbnail + the resized image
*/
private function resizeImage($filename)
{
//This function creates a file with the orig. filename + _thumb
$config['image_library'] = 'ImageMagick';
$config['source_image'] = $filename;
$config['create_thumb'] = TRUE;
$config['maintain_ratio'] = FALSE;
$config['width'] = 60;
$config['height'] = 60;
$config['library_path'] = $this->getLibPath();
$config['quality'] = '100%';
$this->load->library('image_lib', $config);
if ( ! $this->image_lib->resize())
{
echo $this->image_lib->display_errors());
}
$config['create_thumb'] = False;
$config['maintain_ratio'] = TRUE;
$config['width'] = 1080;
$config['height'] = 1920;
$this->image_lib->initialize($config);
if ( ! $this->image_lib->resize())
{
echo $this->image_lib->display_errors());
}
}
I want to upload multiple files using codeigniter.
I have two types of images beforeimage and afterimage. After uploading each image I make entry in database.
I am creating thumbnail as well. To amke it ease I created a separate function, but its not working. this logic works for single image upload.
Html
controller
foreach($_FILES["beforepicture"]['name'] as $key=>$files){
//if(isset($_FILES["beforepicture"]['name']) && $_FILES["beforepicture"]['name'] != ''){
$imagestatus = $this->upload_images($files,'beforepicture');
if(isset($imagestatus['name'])){
$inputdata = array('image' => $imagestatus['name'],
'lead_id' =>$inserted_id,
'user_id'=>$this->session->userdata['userdata']['userid'],
'when'=>'before');
$this->common_model->save('lead_images',$inputdata);
//}
}
}
function upload_images($data = NULL,$inputname=NULL){
if($data){
$this->load->library('image_lib');
// echo '<pre>';
// print_r($_FILES);
$new_name = time().$data;
$config = array(
'upload_path' => getcwd()."/assets/themes/default/avatars/",
'allowed_types' => "gif|jpg|png|jpeg",
'overwrite' => TRUE,
'max_size' => "2048000", // Can be set to particular file size , here it is 2 MB(2048 Kb)
// 'max_height' => "768",
//'max_width' => "1024",
'file_name' => $new_name
);
$this->load->library('upload', $config);
$this->upload->initialize($config);
//$this->upload->initialize($config);
if($this->upload->do_upload($inputname))
{
$image_data = $this->upload->data();
//thumb1
$config = array(
'source_image' => $image_data['full_path'], //path to the uploaded image
'new_image' => getcwd()."/assets/themes/default/avatars/thumb", //path to
'maintain_ratio' => true,
'width' => 180,
'height' => 200
);
$this->image_lib->initialize($config);
$this->image_lib->resize();
$message = array('name' => $image_data['file_name']);
}else
{
//echo $this->upload->display_errors(); die;
$message = array('failed' => $this->upload->display_errors());
}
return $message;
}
}
I am trying but failed
Try this
<?php
class My_Controller extends CI_Controller {
public function __construct() {
parent::__construct();
$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->upload->do_upload();
$fileName = $_FILES['userfile']['name'];
$images[] = $fileName;
}
$fileName = implode(',',$images);
$this->my_model->upload_image($fileName);
}
private function set_upload_options()
{
// upload an image options
$config = array();
$config['upload_path'] = './upload/'; //give the path to upload the image in folder
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '0';
$config['overwrite'] = FALSE;
return $config;
}
}
For more how to upload multiple file in codeigniter try this tutorial:http://w3code.in/2015/09/upload-file-using-codeigniter/
Try this
$files = $_FILES;
$cpt = count($_FILES['beforepicture']['name']);
for($i=0; $i<$cpt; $i++){
$_FILES['beforepicture']['name']= $files['beforepicture']['name'][$i];
$_FILES['beforepicture']['type']= $files['beforepicture']['type'][$i];
$_FILES['beforepicture']['tmp_name']= $files['beforepicture']['tmp_name'][$i];
$_FILES['beforepicture']['error']= $files['beforepicture']['error'][$i];
$_FILES['beforepicture']['size']= $files['beforepicture']['size'][$i];
$imagestatus = $this->upload_images($_FILES["beforepicture"]['name'],'beforepicture');
if(isset($imagestatus['name'])){
$inputdata = array('image' => $imagestatus['name'],
'lead_id' =>$inserted_id,
'user_id'=>$this->session->userdata['userdata']['userid'],
'when'=>'before');
$this->common_model->save('lead_images',$inputdata);
}
}
I am trying make it so when the user uploads their profile picture it resizes it to a size of 180x180 to fit in the profile picture box. I then want it to also create a thumbnail version of that image so I can use it for posts etc. This is the code I have right now:
function do_upload_profilepicture()
{
$this->load->model('model_users');
$userID = $this->model_users->getUserID($this->session->userdata('username'));
$config['upload_path'] = './img/profilepictures/';
$config['allowed_types'] = 'jpg|png';
$config['overwrite'] = TRUE;
$config['file_name'] = $userID;
$config['max_size'] = '500';
$config['max_width'] = '1920';
$config['max_height'] = '1028';
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload())
{
$error = array('error' => $this->upload->display_errors());
$this->load->view('upload_profilepic_form', $error);
}
else
{
$upload_data = $this->upload->data();
$resize['image_library'] = 'gd2';
$resize['source_image'] = $upload_data['full_path'];
$resize['maintain_ratio'] = FALSE;
$resize['width'] = 180;
$resize['height'] = 180;
$this->load->library('image_lib', $resize);
$this->image_lib->resize();
$this->model_users->setProfilePic($userID, $upload_data['orig_name']);
redirect('upload/create_thumb/' . $upload_data['orig_name']);
}
}
function create_thumb() {
$this->load->model('model_users');
$userID = $this->model_users->getUserID($this->session->userdata('username'));
$imgname = $this->model_users->parseURL($_SERVER['REQUEST_URI'], 1);
$source_path = $imgsrc;
$config_manip = array(
'image_library' => 'gd2',
'source_image' => 'img/profilepictures/' . $imgname,
'new_image' => base_url() . 'img/profilepictures/thumbs/' . $imgname,
'maintain_ratio' => TRUE,
'width' => 50,
'height' => 50
);
$this->load->library('image_lib', $config_manip);
if (!$this->image_lib->resize()) {
echo $this->image_lib->display_errors();
}
// clear //
$this->image_lib->clear();
redirect('userprofile/home/' . $userID);
}
}
What happens is it isnt creating the new file, why is this? Is there an easier way to do this?
one problem which i found in your code you are redirecting user just for creating thumbnail you can do in on step just calling that method in do_upload_profilepicture method and pass image name no need to redirect again and again.
function do_upload_profilepicture()
{
$this->load->model('model_users');
$userID = $this->model_users->getUserID($this->session->userdata('username'));
$config['upload_path'] = './img/profilepictures/';
$config['allowed_types'] = 'jpg|png';
$config['overwrite'] = TRUE;
$config['file_name'] = $userID;
$config['max_size'] = '500';
$config['max_width'] = '1920';
$config['max_height'] = '1028';
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload())
{
$error = array('error' => $this->upload->display_errors());
$this->load->view('upload_profilepic_form', $error);
}
else
{
$upload_data = $this->upload->data();
$resize['image_library'] = 'gd2';
$resize['source_image'] = $upload_data['full_path'];
$resize['maintain_ratio'] = FALSE;
$resize['width'] = 180;
$resize['height'] = 180;
$this->load->library('image_lib', $resize);
$this->image_lib->resize();
$this->image_lib->clear();
$this->model_users->setProfilePic($userID, $upload_data['orig_name']);
$this->create_thumb( $upload_data['orig_name']);
redirect('userprofile/home/' . $userID);
}
}
function create_thumb($imgname) {
$source_path = $imgsrc;
$config_manip = array(
'image_library' => 'gd2',
'source_image' => 'img/profilepictures/' . $imgname,
'new_image' => 'img/profilepictures/thumbs/' . $imgname,
'maintain_ratio' => TRUE,
'width' => 50,
'height' => 50
);
$this->load->library('image_lib', $config_manip);
if (!$this->image_lib->resize()) {
echo $this->image_lib->display_errors();
}
// clear //
$this->image_lib->clear();
}
}
you also using base_url in new_image for thumb you need to give file path not http path. i will suggest you to use this library for creating image on fly in codeigniter codeigniter-advanced-images
Update: Complete Controller
the code below only produces the thumbnail of the first image and successfully uploads all the other images. the problem that i am facing is that the other images do get uploaded but their thumbnails aren't.
<?php
class Upload extends CI_Controller{
function __construct()
{
parent::__construct();
$this->upload_path = realpath(APPPATH . '../uploads');
}
function index()
{
$this->load->view('upload_view', array('error' => ''));
}
function start()
{
// var_dump($_FILES); die();
$config['upload_path'] = $this->upload_path;
$config['allowed_types'] = 'gif|jpg|jpeg|png';
$this->load->library('upload', $config);
$status = $this->upload->do_multi_upload();
for($i=0;$i<count($status);$i++)
{
$conf = array(
'source_image' => $status[$i]['full_path'],
'new_image' => $this->upload_path . '/thumbs',
'maintain_ratio' => true,
'width' => 200,
'height' => 200
);
$this->load->library('image_lib', $conf);
$this->image_lib->resize();
$this->image_lib->clear();
}
if (!$status)
{
$error = array('error' => $this->upload->display_errors());
$this->load->view('upload_view', $error);
}
else
{
var_dump($status);
}
}
}
?>
Load the library prior to starting the loop and without passing parameters to it.
Then, for each of the elements in $status do this:
$this->image_lib->initialize($conf);
... and you don't need to use clear() afterwards.