Jump to content

Image Upload Validation Not Working


happypete

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.

 

 

Link to comment
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);
  }
  ## --------------------------------------------------------
 }
?>

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • 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.