Jump to content

Archived

This topic is now archived and is closed to further replies.

happypete

Image Upload Validation Not Working

Recommended Posts

Did that upload succeed through the resize? Those numbers are a lot smaller than the 32M you reported earlier. Was this the same file?

 

echo memory_get_usage() . "<BR>\n"; added

 

at start of script : 664240

after $member->LoggedIn(), : 1882288

before resize-class.php include: 1886432

after resize-class.php include: 1944440

 

these values are when I upload a 1.5m image

 

Start: 648 K

After LoggedIn(): 1,838 K (incease 1,190K)

After checks: 1,842 K (increase 4K)

After resize: 1,898 K (increase 56K)

 

I don't see these numbers as excessive at all. A site I am working on now, showing the list of Blog Topics, reports about 2,902 K once the page is finished loading. But, again, these numbers are very much smaller than the 32M that earlier error message reported.

 

If the upload succeeded, maybe start commenting out the debug code and see if the thing will work now.

 

 

Share this post


Link to post
Share on other sites

Thanks very much for all your help. It works perfectly :) and I've learn loads in the process.

 

Here is the finished upload script with image validation and the resize class from Jarrod Oberto. I've remove the things specific to my project so it should work as a stand alone image upload script. I hope other beginners like me find it usefull...

 

3 files: index.php, process.php & resize-class.php

 

index.php

<?php
@session_start();
?>
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<div class="content">
<h1>Upload an image</h1>
	    <?php if(!empty($_SESSION['msg'])) { echo '<font color="red">'.$_SESSION['msg'].'</font>'; unset($_SESSION['msg']); } ?>
    <form method="post" action="process.php" enctype="multipart/form-data">
	  <label>
	  Select Image <br />
	  <input type="file" name="image" />
	  <br />
	  </label>
	  <div class="clear"></div>
	  <input id="button" class="button" type="submit" name="submit" value="Upload" />
    </form>
</body>
</html>

 

process.php

<?php
@session_start();
// Check if coming from a POST command and
   if($_SERVER['REQUEST_METHOD']=='POST'
   && $_POST['submit']=='Upload' && ($_FILES['image']['error'] == UPLOAD_ERR_OK))
{

$file_size = $_FILES['image']['size'];
$blacklist = array(".php", ".phtml", ".php3", ".php4", ".js", ".shtml", ".pl" ,".py", ".php5", ".htm", ".html", ".zip", ".exe", ".htaccess");

//Remove blacklisted files
foreach ($blacklist as $file)
{
if(preg_match("/$file\$/i", $_FILES['image']['name'])) {
 $_SESSION['msg'] = 'Invalid image format only JPG, PNG & GIF formats';
 header('Location: index.php');
 exit; 
}}

//Check for valid image type
$allowedexts = array('gif','jpeg','jpg','png');
$extension = end(explode('.', strtolower($_FILES['image']['name'])));
if($_FILES['image']['type']=='image/jpeg'||$_FILES['image']['type']=='image/gif'||$_FILES['image']['type']=='image/png'
 && in_array($extension,$allowedexts)){ }
else {
 $_SESSION['msg'] = 'Invalid image format only JPG, PNG & GIF formats';
 header('Location: index.php');
 exit;
}

// Check image size not 0
if($file_size === 0) {
 $_SESSION['msg'] = 'That was an empty file!';
 header('Location: index.php');
 exit;
}

// Check image size not too big
if($file_size >= (2097152)) { // 2MB
 $_SESSION['msg'] = 'Image is to big. Max upload 2MB';
 header('Location: index.php');
 exit;
}

// Check not double extension like bad.php.jpg
else if(substr_count($_FILES['image']['name'], '.')>1){ //check double file type
 $_SESSION['msg'] = 'Invalid image format only JPG, PNG & GIF formats';
 header('Location: index.php');
 exit;
}

  $newPath = '' . basename($_FILES['image']['name']);
  (move_uploaded_file($_FILES['image']['tmp_name'], $newPath));

// *** Include the class
include("resize-class.php");

// *** 1) Initialise / load image
$resizeObj = new resize($newPath);
// *** 2) Resize image (options: exact, portrait, landscape, auto, crop)
$resizeObj -> resizeImage(475, 600, 'landscape');
// *** 3) Save image + define quality
$resizeObj -> saveImage('/home/user/public_html/images/your-image-name.jpg', 85);

// Remove file from temp Directory
unlink($newPath) ;

  // once updated return to admin page
header('Location: index.php?success=3');
exit;
}
else
{
$_SESSION['msg'] = 'ERROR - Image to big or wrong format';
 header('Location: index.php');
 exit;
}
?>

 

resize-class.php

<?php


  # ========================================================================#
  #
  #  Author:    Jarrod Oberto
  #  Version:  1.0
  #  Date:	  17-Jan-10
  #  Purpose:   Resizes and saves image
  #  Requires : Requires PHP5, GD library.
  #  Usage Example:
  #					 include("file:///C|/xampplite/htdocs/inc/classes/resize_class.php");
  #					 $resizeObj = new resize('images/cars/large/input.jpg');
  #					 $resizeObj -> resizeImage(150, 100, 0);
  #					 $resizeObj -> saveImage('images/cars/large/output.jpg', 100);
  #
  #
  # ========================================================================#
 Class resize
 {
  // *** Class variables
  private $image;
  private $width;
  private $height;
  private $imageResized;
  function __construct($fileName)
  {
   // *** Open up the file
   $this->image = $this->openImage($fileName);
   // *** Get width and height
   $this->width  = imagesx($this->image);
   $this->height = imagesy($this->image);
  }
  ## --------------------------------------------------------
  private function openImage($file)
  {
   // *** Get extension
   $extension = strtolower(strrchr($file, '.'));
   switch($extension)
   {
 case '.jpg':
 case '.jpeg':
  $img = @imagecreatefromjpeg($file); // @ REMOVED
  break;
 case '.gif':
  $img = @imagecreatefromgif($file); // @ REMOVED
  break;
 case '.png':
  $img = @imagecreatefrompng($file); // @ REMOVED
  break;
 default:
  $img = false;
  break;
   }
   return $img;
  }
  ## --------------------------------------------------------
  public function resizeImage($newWidth, $newHeight, $option="auto")
  {
   // *** Get optimal width and height - based on $option
   $optionArray = $this->getDimensions($newWidth, $newHeight, $option);
   $optimalWidth  = $optionArray['optimalWidth'];
   $optimalHeight = $optionArray['optimalHeight'];
   // *** Resample - create image canvas of x, y size
   $this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight);
   imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height);
   // *** if option is 'crop', then crop too
   if ($option == 'crop') {
 $this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight);
   }
  }
  ## --------------------------------------------------------

  private function getDimensions($newWidth, $newHeight, $option)
  {
  switch ($option)
   {
 case 'exact':
  $optimalWidth = $newWidth;
  $optimalHeight= $newHeight;
  break;
 case 'portrait':
  $optimalWidth = $this->getSizeByFixedHeight($newHeight);
  $optimalHeight= $newHeight;
  break;
 case 'landscape':
  $optimalWidth = $newWidth;
  $optimalHeight= $this->getSizeByFixedWidth($newWidth);
  break;
 case 'auto':
  $optionArray = $this->getSizeByAuto($newWidth, $newHeight);
  $optimalWidth = $optionArray['optimalWidth'];
  $optimalHeight = $optionArray['optimalHeight'];
  break;
 case 'crop':
  $optionArray = $this->getOptimalCrop($newWidth, $newHeight);
  $optimalWidth = $optionArray['optimalWidth'];
  $optimalHeight = $optionArray['optimalHeight'];
  break;
   }
   return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
  }
  ## --------------------------------------------------------
  private function getSizeByFixedHeight($newHeight)
  {
   $ratio = $this->width / $this->height;
   $newWidth = $newHeight * $ratio;
   return $newWidth;
  }
  private function getSizeByFixedWidth($newWidth)
  {
   $ratio = $this->height / $this->width;
   $newHeight = $newWidth * $ratio;
   return $newHeight;
  }
  private function getSizeByAuto($newWidth, $newHeight)
  {
   if ($this->height < $this->width)
   // *** Image to be resized is wider (landscape)
   {
 $optimalWidth = $newWidth;
 $optimalHeight= $this->getSizeByFixedWidth($newWidth);
   }
   elseif ($this->height > $this->width)
   // *** Image to be resized is taller (portrait)
   {
 $optimalWidth = $this->getSizeByFixedHeight($newHeight);
 $optimalHeight= $newHeight;
   }
   else
   // *** Image to be resizerd is a square
   {
 if ($newHeight < $newWidth) {
  $optimalWidth = $newWidth;
  $optimalHeight= $this->getSizeByFixedWidth($newWidth);
 } else if ($newHeight > $newWidth) {
  $optimalWidth = $this->getSizeByFixedHeight($newHeight);
  $optimalHeight= $newHeight;
 } else {
  // *** Sqaure being resized to a square
  $optimalWidth = $newWidth;
  $optimalHeight= $newHeight;
 }
   }
   return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
  }
  ## --------------------------------------------------------
  private function getOptimalCrop($newWidth, $newHeight)
  {
   $heightRatio = $this->height / $newHeight;
   $widthRatio  = $this->width /  $newWidth;
   if ($heightRatio < $widthRatio) {
 $optimalRatio = $heightRatio;
   } else {
 $optimalRatio = $widthRatio;
   }
   $optimalHeight = $this->height / $optimalRatio;
   $optimalWidth  = $this->width  / $optimalRatio;
   return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
  }
  ## --------------------------------------------------------
  private function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight)
  {
   // *** Find center - this will be used for the crop
   $cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 );
   $cropStartY = ( $optimalHeight/ 2) - ( $newHeight/2 );
   $crop = $this->imageResized;
   //imagedestroy($this->imageResized);
   // *** Now crop from center to exact requested size
   $this->imageResized = imagecreatetruecolor($newWidth , $newHeight);
   imagecopyresampled($this->imageResized, $crop , 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight , $newWidth, $newHeight);
  }
  ## --------------------------------------------------------
  public function saveImage($savePath, $imageQuality="100")
  {
   // *** Get extension
	  $extension = strrchr($savePath, '.');
	  $extension = strtolower($extension);
   switch($extension)
   {
 case '.jpg':
 case '.jpeg':
  if (imagetypes() & IMG_JPG) {
   imagejpeg($this->imageResized, $savePath, $imageQuality);
  }
  break;
 case '.gif':
  if (imagetypes() & IMG_GIF) {
   imagegif($this->imageResized, $savePath);
  }
  break;
 case '.png':
  // *** Scale quality from 0-100 to 0-9
  $scaleQuality = round(($imageQuality/100) * 9);
  // *** Invert quality setting as 0 is best, not 9
  $invertScaleQuality = 9 - $scaleQuality;
  if (imagetypes() & IMG_PNG) {
    imagepng($this->imageResized, $savePath, $invertScaleQuality);
  }
  break;
 // ... etc
 default:
  // *** No extension - No save.
  break;
   }
   imagedestroy($this->imageResized);
  }
  ## --------------------------------------------------------
 }
?>

Share this post


Link to post
Share on other sites

Glad to help. And, thanks for (1) marking the topic solved; and (2) providing the final solution for future searchers.

Share this post


Link to post
Share on other sites

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.