views:

154

answers:

1

So I was on this mission to create a moderately flexible, but most importantly, re-usable handler PHP script for image uploading projects. As I cruised along I ran into a PHP memory limit question that I posted on stackoverflow (can be found here: http://stackoverflow.com/questions/3792058/php-memory-limit) and the awesome and helpful answers I got made me realize that I basically suck at optimizing my PHP scripts. I thought that I'd post what I currently have as my 're-usable' PHP form handler for upload scripts and welcome any feedback the smart devs out there might have to boost performance or all around improve it.

To sum what this handler should do:
1) Allow images to be uploaded
2) Save a full size version of the image that is resized to a desired width
3) Save a thumbnail sized version of the image that is resized to a desired width
4) Place a watermark on both images.

I'm using two open source scripts to help with the resizing and watermarking. How efficiently I'm using them I'm not positive about, but they work and are pretty user friendly.

Simple Image PHP Script: 
http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php

Zubrak's Thumbnail Script:
http://www.zubrag.com/scripts/watermark-image.php

Here's my handler:

<?php
// If a file is being uploaded, do somethin' about it!:
if (!empty($_FILES)) {

    // CONFIGURE:
    // How many pixels wide should the full size image be?
    $fullSizeWidth        =    800;

    // How many pixels wide should the thumbnail image be?
    $thumbnailWidth        =    100;

    // What is the path to the image upload directory?
    $pathToImageDirectory    =    "path/to/image/directory/";

    // Create an array of allowable extension types:
    $validExtensions    =    array('jpg', 'jpeg', 'png');

    // What will the thumbnail version's suffix be?
    $thumbnailSuffix    =    "_thumbnail";

    // What is the path to your watermark image file?
    $pathToWatermark = "path/to/watermark/watermark.png";






    // INCLUDE NEEDED FILES
    // Require the simpleImage class for basic image modifications
    require_once('simpleImage.php');

    // Require the Zubrag_watermark class for adding your watermark to images
    require_once('Zubrag_watermark.php');






    // GET THE USER DATA FROM THE FORM (for demo we'll just say they're submitting an image file only):
    // Get the file's temporary name:
    $tempFile             =     $_FILES['file']['tmp_name'];

    // Get the file's original name:
    $userFileName        =    $_FILES['file']['name'];

    // Get the file's extension:
    $extension = strtolower(end(explode(".", $userFileName)));





    // UPLOAD DESITNATION:
    // Re-name the image something cool (We'll just hash it for now):
    $theImageName            =    sha1($userFileName);

    // Create the full sized image destination by combining it all
    $imageDestination             =    $pathToImageDirectory . $theImageName . "." . $extension;

    // Create the thumbnail sized image destination by combining it all
    $thumbnailDestination    =    $pathToImageDirectory . $theImageName . $thumbnailSuffix . "." . $extension;





    // VALIDATE THE IMAGE:
    // Check to see if the uploaded file has an acceptable extension
    if(in_array($extension, $validExtensions)) {
        $validExtension        =    true;    
    } else {
        $validExtension        =    false;    
    }

    // Run getImageSize function to check that we're really getting an image
    if(getimagesize($tempFile) == false) {
        $validImage        =    false;    
    } else {
        $validImage        =    true;    
    }






    // If the extension is valid and the image is valid, accept the file, resize it, and watermark it:
    if($validExtension == true && $validImage == true) {
        if(move_uploaded_file($tempFile,$imageDestination)) {
            // RESIZE THE IMAGES

            // Create simpleImage object
            $image = new SimpleImage();

            // Load the uploaded file to memory
            $image->load($imageDestination);

            // Resize the image to desired full size width
            $image->resizeToWidth($fullSizeWidth);

            // Save the image's full sized version
            $image->save($imageDestination);

            // Resize the image to the desired thumbnail width
            $image->resizeToWidth($thumbnailWidth);


            // Save the image's thumbnail sized version
               $image->save($thumbnailDestination);

            // Free the image from memory (note: I added this function to the simpleImage class -- it's simply: imagedestroy($this->image);)
            $image->Free();

            // WATERMARK THE IMAGES
            // Load the full size image into memory
            $watermark = new Zubrag_watermark($imageDestination);

            // Apply the watermark
             $watermark->ApplyWatermark($pathToWatermark);

            // Save the watermarked full-sized file
              $watermark->SaveAsFile($imageDestination);

            // Free the full sized image from memory
            $watermark->Free();

            // Load the thumbnail sized image into memory
            $watermark = new Zubrag_watermark($thumbnailDestination);

            // Apply the watermark
             $watermark->ApplyWatermark($pathToWatermark);

            // Save the thumbnail-sized File
              $watermark->SaveAsFile($thumbnailDestination);

            // Free the image from memory
            $watermark->Free();    
        }
    } else {
        // Error handling for an image that did not pass validation
        echo "So we're basically thinking you tried to upload something that wasn't an image.";
    }
} else {
    // Error handling for running this script without a file being uploaded
    echo "You should probably upload a file next time.";
}

Thanks all... Any help/thoughts/debate/feedback would be really appreciated.

A: 

A possibly completely different solution might be to try doing it in the clientside before it gets sent. I've only used it to manage uploads, but if you check out http://plupload.com they have a great upload utility. It will actually do some resizing on the client (in flash or html5) before the photos get sent. Faster upload times for you and the user, and a pretty great user experience for uploading, too.

E-Rock