Lost Password?

  #1 (permalink)  
Old 08-13-2007, 08:02 PM
John's Avatar   
John John is offline
Co-Administrator
 
Join Date: Jul 2006
Age: 19
Posts: 2,347
Last Blog:
PHP Function Overloadi...
Rep Power: 50
John is a glorious beacon of lightJohn is a glorious beacon of lightJohn is a glorious beacon of lightJohn is a glorious beacon of lightJohn is a glorious beacon of light
Send a message via AIM to John
Default PHP: Upload Class

I've been making an OOP library of all methods/functions I use on a daily basis that need validation. Hope someone else can make use if it.

Upload.php
PHP Code:
<?php
/**
 * This class allows a user to upload and 
 * validate their files.
 *
 * @author John Ciacia <Sidewinder@extreme-hq.com>
 * @version 1.0
 * @copyright Copyright (c) 2007, John Ciacia
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 */
class Upload {
    
    
/**
     *@var string contains the name of the file to be uploaded.
     */
    
var $FileName;
    
/**
     *@var string contains the temporary name of the file to be uploaded.
     */
    
var $TempFileName;
    
/**
     *@var string contains directory where the files should be uploaded.
     */
    
var $UploadDirectory;
    
/**
     *@var string contains an array of valid extensions which are allowed to be uploaded.
     */
    
var $ValidExtensions;
    
/**
     *@var string contains a message which can be used for debugging.
     */
    
var $Message;
    
/**
     *@var integer contains maximum size of fiels to be uploaded in bytes.
     */
    
var $MaximumFileSize;
    
/**
     *@var bool contains whether or not the files being uploaded are images.
     */
    
var $IsImage;
    
/**
     *@var string contains the email address of the recipient of upload logs.
     */
    
var $Email;
    
/**
     *@var integer contains maximum width of images to be uploaded.
     */
    
var $MaximumWidth;
    
/**
     *@var integer contains maximum height of images to be uploaded.
     */
    
var $MaximumHeight;

    function 
Upload()
    {

    }

    
/**
     *@method bool ValidateExtension() returns whether the extension of file to be uploaded
     *    is allowable or not.
     *@return true the extension is valid.
     *@return false the extension is invalid.
     */
    
function ValidateExtension()
    {

        
$FileName trim($this->FileName);
        
$FileParts pathinfo($FileName);
        
$Extension strtolower($FileParts['extension']);
        
$ValidExtensions $this->ValidExtensions;

        if (!
$FileName) {
            
$this->SetMessage("ERROR: File name is empty.");
            return 
false;
        }

        if (!
$ValidExtensions) {
            
$this->SetMessage("WARNING: All extensions are valid.");
            return 
true;
        }

        if (
in_array($Extension$ValidExtensions)) {
            
$this->SetMessage("MESSAGE: The extension '$Extension' appears to be valid.");
            return 
true;
        } else {
            
$this->SetMessage("Error: The extension '$Extension' is invalid.");
            return 
false;  
        }

    }

    
/**
     *@method bool ValidateSize() returns whether the file size is acceptable.
     *@return true the size is smaller than the alloted value.
     *@return false the size is larger than the alloted value.
     */
    
function ValidateSize()
    {
        
$MaximumFileSize $this->MaximumFileSize;
        
$TempFileName $this->GetTempName();
        
$TempFileSize filesize($TempFileName);

        if(
$MaximumFileSize == "") {
            
$this->SetMessage("WARNING: There is no size restriction.");
            return 
true;
        }

        if (
$MaximumFileSize <= $TempFileSize) {
            
$this->SetMessage("ERROR: The file is too big. It must be less than $MaximumFileSize and it is $TempFileSize.");
            return 
false;
        }

        
$this->SetMessage("Message: The file size is less than the MaximumFileSize.");
        return 
true;
    }

    
/**
     *@method bool ValidateExistance() determins whether the file already exists. If so, rename $FileName.
     *@return true can never be returned as all file names must be unique.
     *@return false the file name does not exist.
     */
    
function ValidateExistance()
    {
        
$FileName $this->FileName;
        
$UploadDirectory $this->UploadDirectory;
        
$File $UploadDirectory $FileName;

        if (
file_exists($File)) {
            
$this->SetMessage("Message: The file '$FileName' already exist.");
            
$UniqueName rand() . $FileName;
            
$this->SetFileName($UniqueName);
            
$this->ValidateExistance();
        } else {
            
$this->SetMessage("Message: The file name '$FileName' does not exist.");
            return 
false;
        }
    }

    
/**
     *@method bool ValidateDirectory()
     *@return true the UploadDirectory exists, writable, and has a traling slash.
     *@return false the directory was never set, does not exist, or is not writable.
     */
    
function ValidateDirectory()
    {
        
$UploadDirectory $this->UploadDirectory;

        if (!
$UploadDirectory) {
            
$this->SetMessage("ERROR: The directory variable is empty.");
            return 
false;
        }

        if (!
is_dir($UploadDirectory)) {
            
$this->SetMessage("ERROR: The directory '$UploadDirectory' does not exist.");
            return 
false;
        }

        if (!
is_writable($UploadDirectory)) {
            
$this->SetMessage("ERROR: The directory '$UploadDirectory' does not writable.");
            return 
false;
        }

        if (
substr($UploadDirectory, -1) != "/") {
            
$this->SetMessage("ERROR: The traling slash does not exist.");
            
$NewDirectory $UploadDirectory "/";
            
$this->SetUploadDirectory($NewDirectory);
            
$this->ValidateDirectory();
        } else {
            
$this->SetMessage("MESSAGE: The traling slash exist.");
            return 
true;
        }
    }

    
/**
     *@method bool ValidateImage()
     *@return true the image is smaller than the alloted dimensions.
     *@return false the width and/or height is larger then the alloted dimensions.
     */
    
function ValidateImage() {
        
$MaximumWidth $this->MaximumWidth;
        
$MaximumHeight $this->MaximumHeight;
        
$TempFileName $this->TempFileName;

    if(
$Size = @getimagesize($TempFileName)) {
        
$Width $Size[0];   //$Width is the width in pixels of the image uploaded to the server.
        
$Height $Size[1];  //$Height is the height in pixels of the image uploaded to the server.
    
}

        if (
$Width $MaximumWidth) {
            
$this->SetMessage("The width of the image [$Width] exceeds the maximum amount [$MaximumWidth].");
            return 
false;
        }

        if (
$Height $MaximumHeight) {
            
$this->SetMessage("The height of the image [$Height] exceeds the maximum amount [$MaximumHeight].");
            return 
false;
        }

        
$this->SetMessage("The image height [$Height] and width [$Width] are within their limitations.");     
        return 
true;
    }

    
/**
     *@method bool SendMail() sends an email log to the administrator
     *@return true the email was sent.
     *@return false never.
     *@todo create a more information-friendly log.
     */
    
function SendMail() {
        
$To $this->Email;
        
$Subject "File Uploaded";
        
$From "From: Uploader";
        
$Message "A file has been uploaded.";
        
mail($To$Subject$Message$From);
        return 
true;
    }


    
/**
     *@method bool UploadFile() uploads the file to the server after passing all the validations.
     *@return true the file was uploaded.
     *@return false the upload failed.
     */
    
function UploadFile()
    {

        if (!
$this->ValidateExtension()) {
            die(
$this->GetMessage());
        } 

        else if (!
$this->ValidateSize()) {
            die(
$this->GetMessage());
        }

        else if (
$this->ValidateExistance()) {
            die(
$this->GetMessage());
        }

        else if (!
$this->ValidateDirectory()) {
            die(
$this->GetMessage());
        }

        else if (
$this->IsImage && !$this->ValidateImage()) {
            die(
$this->GetMessage());
        }

        else {

            
$FileName $this->FileName;
            
$TempFileName $this->TempFileName;
            
$UploadDirectory $this->UploadDirectory;

            if (
is_uploaded_file($TempFileName)) { 
                
move_uploaded_file($TempFileName$UploadDirectory $FileName);
                return 
true;
            } else {
                return 
false;
            }

        }

    }

    
#Accessors and Mutators beyond this point.
    #Siginificant documentation is not needed.
    
function SetFileName($argv)
    {
        
$this->FileName $argv;
    }

    function 
SetUploadDirectory($argv)
    {
        
$this->UploadDirectory $argv;
    }

    function 
SetTempName($argv)
    {
        
$this->TempFileName $argv;
    }

    function 
SetValidExtensions($argv)
    {
        
$this->ValidExtensions $argv;
    }

    function 
SetMessage($argv)
    {
        
$this->Message $argv;
    }

    function 
SetMaximumFileSize($argv)
    {
        
$this->MaximumFileSize $argv;
    }

    function 
SetEmail($argv)
    {
        
$this->Email $argv;
    }
   
    function 
SetIsImage($argv)
    {
        
$this->IsImage $argv;
    }

    function 
SetMaximumWidth($argv)
    {
        
$this->MaximumWidth $argv;
    }

    function 
SetMaximumHeight($argv)
    {
        
$this->MaximumHeight $argv;
    }   
    function 
GetFileName()
    {
        return 
$this->FileName;
    }

    function 
GetUploadDirectory()
    {
        return 
$this->UploadDirectory;
    }

    function 
GetTempName()
    {
        return 
$this->TempFileName;
    }

    function 
GetValidExtensions()
    {
        return 
$this->ValidExtensions;
    }

    function 
GetMessage()
    {
        if (!isset(
$this->Message)) {
            
$this->SetMessage("No Message");
        }

        return 
$this->Message;
    }

    function 
GetMaximumFileSize()
    {
        return 
$this->MaximumFileSize;
    }

    function 
GetEmail()
    {
        return 
$this->Email;
    }

    function 
GetIsImage()
    {
        return 
$this->IsImage;
    }

    function 
GetMaximumWidth()
    {
        return 
$this->MaximumWidth;
    }

    function 
GetMaximumHeight()
    {
        return 
$this->MaximumHeight;
    }
}


?>
Usage:
index.php
PHP Code:
<?php
include("Upload.php");

echo 
"<form enctype='multipart/form-data' action='index.php' method='POST'>"
."<input name='upload' type='file' /><input type='submit' value='Upload' />"
."</form>";


if(
$_FILES['upload']['tmp_name']) {
    
$upload = new Upload();
    
$upload->SetFileName($_FILES['upload']['name']);
    
$upload->SetTempName($_FILES['upload']['tmp_name']);
    
$upload->SetUploadDirectory("/var/www/upload/"); //Upload directory, this should be writable
    
$upload->SetValidExtensions(array('gif''jpg''jpeg''png')); //Extensions that are allowed if none are set all extensions will be allowed.
    //$upload->SetEmail("Sidewinder@codecall.net"); //If this is set, an email will be sent each time a file is uploaded.
    //$upload->SetIsImage(true); //If this is set to be true, you can make use of the MaximumWidth and MaximumHeight functions.
    //$upload->SetMaximumWidth(60); // Maximum width of images
    //$upload->SetMaximumHeight(400); //Maximum height of images
    
$upload->SetMaximumFileSize(300000); //Maximum file size in bytes, if this is not set, the value in your php.ini file will be the maximum value
    
echo $upload->UploadFile();

}

?>
__________________
CodeCall Blog | CodeCall Wiki | Shareware | Linux Forum | My Blog
Chat with other CodeCall members on IRC; connect to irc.codecall.net and join #codecall

Last edited by John; 12-04-2007 at 02:34 PM.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

Sponsored Links
  #2 (permalink)  
Old 08-14-2007, 09:02 AM
Jordan's Avatar   
Jordan Jordan is offline
Administrator
 
Join Date: Nov 2005
Location: Hendersonville, NC
Age: 25
Posts: 4,524
Last Blog:
PHP: Variable variable...
Rep Power: 50
Jordan has much to be proud ofJordan has much to be proud ofJordan has much to be proud ofJordan has much to be proud ofJordan has much to be proud ofJordan has much to be proud ofJordan has much to be proud ofJordan has much to be proud of
Send a message via ICQ to Jordan Send a message via AIM to Jordan Send a message via MSN to Jordan
Default

Very nicely done Sidewinder. I'll defiantly be using this in the future.
__________________
CodeCall Blog | CodeCall Wiki | Shareware Site | Linux Forum | Write a Blog
Chat with other CodeCall members on IRC; connect to irc.codecall.net and join #codecall
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #3 (permalink)  
Old 05-16-2008, 12:42 PM
TcM's Avatar   
TcM TcM is offline
Terminator - I'll be back
 
Join Date: Aug 2006
Location: In a technologic world :p
Posts: 5,718
Rep Power: 47
TcM is a jewel in the roughTcM is a jewel in the roughTcM is a jewel in the rough
Default Re: PHP: Upload Class

Thanks. I just needed this for my website!
__________________
CodeCall Blog | CodeCall Wiki | Shareware | Linux Forum
Chat with other CodeCall members on IRC; connect to irc.codecall.net and join #codecall


Business Directory | Technology Blog | Windows Help
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #4 (permalink)  
Old 05-16-2008, 12:45 PM
Xav's Avatar   
Xav Xav is offline
Guru
 
Join Date: Mar 2008
Location: London, England
Posts: 3,001
Last Blog:
Piano Exam
Rep Power: 26
Xav is a name known to allXav is a name known to allXav is a name known to allXav is a name known to allXav is a name known to allXav is a name known to all
Send a message via MSN to Xav
Default Re: PHP: Upload Class

Your surname is Ciacia? Cool.
__________________
Xav, the power of youth
Worship the Creator... not his creations
Web Site | Beta Site
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #5 (permalink)  
Old 05-16-2008, 04:22 PM
John's Avatar   
John John is offline
Co-Administrator
 
Join Date: Jul 2006
Age: 19
Posts: 2,347
Last Blog:
PHP Function Overloadi...
Rep Power: 50
John is a glorious beacon of lightJohn is a glorious beacon of lightJohn is a glorious beacon of lightJohn is a glorious beacon of lightJohn is a glorious beacon of light
Send a message via AIM to John
Default Re: PHP: Upload Class

Quote:
Originally Posted by TcM View Post
Thanks. I just needed this for my website!
The image validation's are not 100% secure.

Quote:
Originally Posted by Xav View Post
Your surname is Ciacia? Cool.
Yes.
__________________
CodeCall Blog | CodeCall Wiki | Shareware | Linux Forum | My Blog
Chat with other CodeCall members on IRC; connect to irc.codecall.net and join #codecall
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

Sponsored Links
  #6 (permalink)  
Old 05-17-2008, 04:02 AM
TcM's Avatar   
TcM TcM is offline
Terminator - I'll be back
 
Join Date: Aug 2006
Location: In a technologic world :p
Posts: 5,718
Rep Power: 47
TcM is a jewel in the roughTcM is a jewel in the roughTcM is a jewel in the rough
Default Re: PHP: Upload Class

I don't need that. I just need the file extension validation and the file size. I tested the extension validation, seems to be working fine, I didn't test the size validation though.

I had to edit it a little bit so it works with my script, but so far it's perfect.

BTW I am using it to upload more than one file (from 1 to 10 files) depending on the user. Now my problem is this, This class upload one file to temp, validates it, and them moves it to the folder. Now as I am uploading more than one file, is there a way to make it, upload all the files to temp, then validates them all, and them moves them all at the same moment. So if one file is invalid, the user will have to upload all the files again, because in this way I will have duplicate files.

Thanks.
__________________
CodeCall Blog | CodeCall Wiki | Shareware | Linux Forum
Chat with other CodeCall members on IRC; connect to irc.codecall.net and join #codecall


Business Directory | Technology Blog | Windows Help

Last edited by TcM; 05-17-2008 at 10:18 AM.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #7 (permalink)  
Old 05-18-2008, 07:20 PM
DevilsCharm's Avatar   
DevilsCharm DevilsCharm is offline
Programming God
 
Join Date: Jul 2006
Posts: 875
Rep Power: 13
DevilsCharm is on a distinguished road
Default Re: PHP: Upload Class

Isn't it great when people use your features!