SunQuest
 
       PHP
  Home arrow PHP arrow Page 2 - Storage and Re-use of Images Using PHP/GD ...
Dev Articles Forums 
ADO.NET  
Apache  
ASP  
ASP.NET  
C#  
C++  
ColdFusion  
COM/COM+  
Delphi-Kylix  
Design Usability  
Development Cycles  
DHTML  
Embedded Tools  
Flash  
Graphic Design  
HTML  
IIS  
Interviews  
Java  
JavaScript  
MySQL  
Oracle  
Photoshop  
PHP  
Reviews  
Ruby-on-Rails  
SQL  
SQL Server  
Style Sheets  
VB.Net  
Visual Basic  
Web Authoring  
Web Services  
Web Standards  
XML  
Dedicated Servers  
Actuate Whitepapers 
Moblin 
IBM® developerWorks 
Sun Developer Network 
Weekly Newsletter
 
Developer Updates  
Free Website Content 
IBM developerWorks
 RSS  Articles
 RSS  Forums
 RSS  All Feeds
Write For Us Get Paid 
Request Media Kit
Contact Us 
Site Map 
Privacy Policy 
Support 
 USERNAME
 
 PASSWORD
 
 
  >>> SIGN UP!  
  Lost Password? 
PHP

Storage and Re-use of Images Using PHP/GD - Part 1
By: Gijs van Tulder
  • Search For More Articles!
  • Disclaimer
  • Author Terms
  • Rating: 4 stars4 stars4 stars4 stars4 stars / 4
    2003-07-17

    Table of Contents:
  • Storage and Re-use of Images Using PHP/GD - Part 1
  • The Article
  • Conclusion

  • Rate this Article: Poor Best 
      ADD THIS ARTICLE TO:
      Del.ici.ous Digg
      Blink Simpy
      Google Spurl
      Y! MyWeb Furl
    Email Me Similar Content When Posted
    Add Developer Shed Article Feed To Your Site
    Email Article To Friend
    Print Version Of Article
    PDF Version Of Article
     
     
    ADVERTISEMENT

    AT&T devCentral & BlackBerry(r) Webcast Series: BlackBerry and GPS -Build Location Awareness into your BlackBerry Applications, July 10th -1:00PM EST. Register Today!

    Storage and Re-use of Images Using PHP/GD - Part 1 - The Article


    (Page 2 of 3 )

    Our Wish List

    We want to have a system that we can use to:

    1. upload and store our images;
    2. search our image database;
    3. publish our images on our web site;
    4. maintain a central list of alt-tags.

    We also want our system as flexible as possible. To make it easy to use, it has to accept and convert the following range of image types: jpeg, gif, png, bmp. Those formats have to be converted to jpeg and png, and stored for later use. When retrieving our images, it would be nice if we could resize them as we need.

    In this first of two instalments, we will build the scripts that upload, convert and store the images. In the second instalment, we will write a simple search function and the image retrieval-part.

    What We Need

    The mission described above can be accomplished using the following open-source tools and libraries:

    • PHP, compiled with the GD-library, MySQL and jpeg-support;
    • a working MySQL-server for storing the image info;
    • a working instance of the image conversion and resizing script I described in this article;
    • the following converters found in the netpbm-toolkit: bmptoppm, , pngtopnm, pnmtopng, ppmtogif;
    • the gif2png utility.

    You can compile your own versions of these conversion utilities. You can also download the binary versions I compiled for Linux i386 (97 kB download).

    The Database Layout

    When uploading, we will store the image information in a MySQL-table for later use. In the database, we will store the following information:

    • the filename of the image (the generated 13 character name);
    • the image type (jpeg or png);
    • the image width and height;
    • the size of the image in bytes;
    • the title of the image for our own search purposes;
    • a description of the image, also to search and find;
    • the alt-tag of the image, to display when publishing the image.

    Create the database using the following SQL-query.

    CREATE TABLE images (
    img_id mediumint(9) NOT NULL auto_increment,
    img_file varchar(13) NOT NULL default '',
    img_type enum('JPG','PNG') NOT NULL default 'JPG',
    img_height smallint(6) NOT NULL default '0',
    img_width smallint(6) NOT NULL default '0',
    img_bytes mediumint(9) NOT NULL default '0',
    img_title tinytext NOT NULL,
    img_descr mediumtext NOT NULL,
    img_alt tinytext NOT NULL,
    PRIMARY KEY (img_id)
    ) TYPE=MyISAM;

    Part 1: The Upload Script

    In this first instalment, we will write the scripts that handle the uploading, converting and storing of the image. We will concentrate on the scripting; you can design your own interface.

    The Form

    The user will fill in a simple html-form to add an image to the database. Save this form as upload.html.

    <form enctype="multipart/form-data" method="post" action="upload.php">
    <b>Upload image</b><br>
    Select image: <input name="file" type="file"><br>
    Title: <input name="title" type="text"><br>
    Description: <textarea name="descr"></textarea><br>
    Alt-text: <input name="alt" type="text"><br>
    <input type="submit" value="Upload">
    </form>

    The Script

    The form is sent to upload.php. Save the script as upload.php.

    Settings

    // define the base image dir 
    $base_img_dir = "./img/";
    // define location of image conversion programs
    $img_conv_dir = "./bin/";
    // define database table containing image info
    $img_table = "images";
    // connect with database
    mysql_connect("yourhost", "youruser", "yourpass");
    mysql_select_db("yourtable");

    Moving the File

    // generate unique id for use in filename
    $uniq = uniqid("");
    // new file name
    $filename = $base_img_dir.$uniq;
    // move uploaded file to destination
    move_uploaded_file($HTTP_POST_FILES["file"]["tmp_name"], $filename);

    First, we generate a 13 characters long, unique name for our image. This name will be used to save the image in the file system. We save the value of $uniq in the database, to identify the image. The uploaded file is moved to its destination.

    Handling the Image

    // retrieve image info
    $imginfo = getimagesize($filename);
    // handle image according to type
    switch ($imginfo[2]) {
    case 1: // gif
    // convert gif to png using shell command
    $command = $img_conv_dir."gif2png $filename";
    exec($command);
    // remove original gif file and rename converted png
    unlink($filename);
    rename("$filename.png", $filename);
    // check png image by loading and saving the file
    // to prevent wrong uploaded files and errors
    $img = imagecreatefrompng($filename);
    imagepng($img, $filename);
    imagedestroy($img);
    // set image type to png
    $img_type = "PNG";
    break;

    We start handling the file by retrieving the image info using the getimagesize() -method. $imginfo[2] contains a number identifying the image type. In case of a gif-file, we first need to convert it to the more usable png-format. With the gif2png shell command, the image is converted and saved as $filename.png. We then just have to save the image with the original filename, without extension, to continue.

    To check for wrong uploaded files, not-png for instance, we let PHP load the image and save it again. By doing so, we get possible errors when uploading, not when retrieving.

    case 2: // jpeg
    // check jpeg image by loading and saving the file
    // to prevent wrong uploaded files and errors
    $img = imagecreatefromjpeg($filename);
    imagejpeg($img, $filename);
    imagedestroy($img);
    // set image type to jpeg
    $img_type = "JPG";
    break;
    case 3: // png
    // check png image by loading and saving the file
    // to prevent wrong uploaded files and errors
    $img = imagecreatefrompng($filename);
    imagepng($img, $filename);
    imagedestroy($img);
    // set image type to png
    $img_type = "PNG";
    break;

    Png and jpeg-images are handled just like gif-files, with the only exception that they do not have to be converted to a png-file.

    case 4: // bmp
    // rename file to bmp
    rename($filename, "$filename.bmp");
    // convert bmp to png using shell command
    $command = $img_conv_dir."bmptoppm $filename.bmp | ".
    $img_conv_dir."pnmtopng > $filename";
    exec($command);
    // remove original bmp
    unlink("$filename.bmp");
    // check png image by loading and saving the file
    // to prevent wrong uploaded files and errors
    $img = imagecreatefrompng($filename);
    imagepng($img, $filename);
    imagedestroy($img);
    // set image type to png
    $img_type = "PNG";
    break;
    default:
    break;
    }

    The bmp format needs to be converted. We use the programs bmptoppm and pnmtopng to get a nice png. bmptoppm for some reason only accepts files that have a .bmp-extension, so we will have to rename the uploaded file before running it.

    Collecting the Last Bits of Information

    // retrieve image file size
    $imgbytes = filesize($filename);

    After we have asked filesize() for the size of the image, we now know the following about our image:

    1. the unique filename ($uniq);
    2. the image type ($img_type);
    3. the image height ($imginfo[1]);
    4. the image width ($imginfo[0]);
    5. the image size ($imgbytes);
    6. the image title ($ title);
    7. the image description ($descr);
    8. the image alt-tag ($alt).

    The last step is the actually saving of this information in the database and displaying a message for the user.

    // insert image into db
    mysql_query("INSERT INTO $img_table (img_file, img_type, img_height,
    img_width, img_bytes, img_title, img_descr, img_alt)
    VALUES('$uniq', '$img_type', ".$imginfo[1].", ".$imginfo[0].",
    $imgbytes, '".addslashes($HTTP_POST_VARS["title"])."', '".
    addslashes($HTTP_POST_VARS["descr"])."',
    '".addslashes($HTTP_POST_VARS["alt"])."');");
    // display some information
    echo "Image uploaded.<br><img src=\"img.php?f($uniq)+x(300)\"><br>".
    "URL: img.php?f($uniq)";

    More PHP Articles
    More By Gijs van Tulder


     

    PHP ARTICLES

    - Making Usage Statistics in PHP
    - Installing PHP under Windows: Further Config...
    - File Version Management in PHP
    - Statistical View of Data in a Clustered Bar ...
    - Creating a Multi-File Upload Script in PHP
    - Executing Microsoft SQL Server Stored Proced...
    - Code 10x More Efficiently Using Data Access ...
    - A Few Tips for Speeding Up PHP Code
    - The Modular Web Page
    - Quick E-Commerce with PHP and PayPal
    - Regression Testing With JMeter
    - Building an Iterator with PHP
    - PHP Frontend to ImageMagick
    - Using PEAR's mimeDecode Module
    - Incoming Mail and PHP







    © 2003-2008 by Developer Shed. All rights reserved. DS Cluster 6 hosted by Hostway