PHPology is a collective of highly skilled, award winning, web gurus.
Contact Raj on 07985 467 213 or email [email protected]
Upload and resize images with PHP
Now this is a fairly common request on the net so I thought I put in my two pence and showcase how I upload and resize images... Below is my class that handles all my uploading and resizing functionality:
<?php class Uploader { public $Filename; public $Filename_temp; public $Filename_cleaned; public $Directory; public $Extension; private $__Allowed_extensions_array = array("jpg", "png", "gif", "doc", "docx", "pdf", "flv", "mp4", "mov"); public function __construct() { $this--->Filename = null; $this->Filename_temp = null; $this->Filename_cleaned = null; $this->Directory = null; $this->Extension = null; } public function Upload() { //get information about this file $file_info_array = pathinfo($this->Filename); $this->Extension = strtolower($file_info_array['extension']); //extension has been found in database, so its not a dodgy file if($this->Is_extension_allowed($this->Extension)) { if($this->Filename != "") { //add the filename to the start of it //remove the extension and clean the filename $this->Filename_cleaned = $file_info_array['filename']; $this->Filename_cleaned = strtolower(str_replace(" ", "-", $this->Filename_cleaned)); $this->Filename_cleaned = strtolower(str_replace("_", "-", $this->Filename_cleaned)); $this->Filename_cleaned = strtolower(str_replace("'", "", $this->Filename_cleaned)); // Create a unique file name $this->Filename_cleaned = $this->Filename_cleaned."-".date("s")."." . $this->Extension; if (!copy($this->Filename_temp, $this->Directory.$this->Filename_cleaned)) { return array("error_code" => 500, "error_message" => "Failed to copy file: ". $this->Filename_temp." - ".$this->Directory.$this->Filename_cleaned); } unlink($this->Filename_temp); //send out an array with the relevent details $file_array = array("filename" => $this->Filename_cleaned, "ext" => $this->Extension, "filename_without_extension" => $this->Get_file_without_extension($this->Filename_cleaned), "error_code" => 200); return $file_array; } else { return array("error_code" => 500, "error_message" => "File was empty"); } } else { return array("error_code" => 500, "error_message" => "Invalid extension"); } } public function Is_extension_allowed($ext = null) { //is the given extension allowed if(in_array($ext, $this->__Allowed_extensions_array)) { return true; } else { return false; } } public function Get_file_extension($filename = null) { //get information about this file $file_info_array = pathinfo($filename); $this->Extension = $file_info_array['extension']; return strtolower($this->Extension); } public function Get_file_without_extension($filename = null) { //get information about this file $file_info_array = pathinfo($filename); return $file_info_array['filename']; } public function Get_readable_filesize($size = 0) { /* Returns a human readable size */ $i=0; $iec = array("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"); while (($size/1024)>1) { $size=$size/1024; $i++; } return substr($size, 0, strpos($size,'.')+4).$iec[$i]; } public function Resize_image($width = 0, $height = 0, $quality = 90, $filename_in = null, $filename_out = null) { $this->Filename = $filename_in; $this->Extension = strtolower($this->Get_file_extension($this->Filename)); $size = getimagesize($this->Filename); $ratio = $size[0] / $size[1]; if ($ratio >= 1){ $scale = $width / $size[0]; } else { $scale = $height / $size[1]; } // make sure its not smaller to begin with! if ($width >= $size[0] && $height >= $size[1]){ $scale = 1; } //height is not required and can be based by width only if($height == 0) { $scale = $width / $size[0]; } //width is not required and can be based by height only if($width == 0) { $scale = $height / $size[1]; } // echo $fileext; switch ($this->Extension) { case "jpg": $im_in = imagecreatefromjpeg($this->Filename); $im_out = imagecreatetruecolor($size[0] * $scale, $size[1] * $scale); imagecopyresampled($im_out, $im_in, 0, 0, 0, 0, $size[0] * $scale, $size[1] * $scale, $size[0], $size[1]); imagejpeg($im_out, $filename_out, $quality); break; case "gif": $im_in = imagecreatefromgif($this->Filename); $im_out = imagecreatetruecolor($size[0] * $scale, $size[1] * $scale); imagecopyresampled($im_out, $im_in, 0, 0, 0, 0, $size[0] * $scale, $size[1] * $scale, $size[0], $size[1]); imagegif($im_out, $filename_out, $quality); break; case "png": $im_in = imagecreatefrompng($this->Filename); $im_out = imagecreatetruecolor($size[0] * $scale, $size[1] * $scale); imagealphablending($im_in, true); // setting alpha blending on imagesavealpha($im_in, true); // save alphablending setting (important) imagecopyresampled($im_out, $im_in, 0, 0, 0, 0, $size[0] * $scale, $size[1] * $scale, $size[0], $size[1]); imagepng($im_out, $filename_out, 9); break; } imagedestroy($im_out); imagedestroy($im_in); } } ?>
Once the form has been submitted, the below code takes care of the uploading and resizing:
<?php $u = new Uploader; $u--->Directory = PATH_TO_FOLDER; //this needs to be updated and the define variable should be found in the config.php file //upload the file $u->Filename = $_FILES['FORM_ELEMENT']['name']; $u->Filename_temp = $_FILES['FORM_ELEMENT']['tmp_name']; $file_array = $u->Upload(); if(is_array($file_array) && ($file_array['error_code'] == 200)) { //if the upload was successful, resize the image to the dimensions required $profile_image = $file_array['filename']; $image_without_extension = $file_array['filename_without_extension']; $image_ext = $file_array['ext']; $u->Resize_image(256, 192, 90, $u->Directory.$profile_image, $u->Directory.$image_without_extension."-small.".$image_ext); //refer to the Resize_image function in Uploader class } ?>