Hello,
I have the following script which is called by upload.php. I'm uploading images to my web server.
The script currently checks for a variety of extensions. I simply want to modify the script to check for only the .gif extension and create a message when it is not.
I'm really not sure where to make this change and I don't want to screwup the script. I'm sure it's a simple change, I just can't see it.
Any help would be most appreciated.
Gary
<?php
/**
class uploader
[0] - "No file was uploaded"
[1] - "Maximum file size exceeded"
[2] - "Maximum image size exceeded"
[3] - "Only specified file type may be uploaded"
[4] - "File already exists" (save only)
[5] - "Unable to copy file (it may already exist)"
*/
class uploader {
var $file;
var $language;
var $acceptable_file_types;
var $error;
var $errors; // Depreciated (only for backward compatability)
var $accepted;
var $max_filesize;
var $max_image_width;
var $max_image_height;
function uploader ( $language = 'en' ) {
$this->language = strtolower($language);
$this->error = '';
}
function max_filesize($size){
$this->max_filesize = (int) $size;
}
function max_image_size($width, $height){
$this->max_image_width = (int) $width;
$this->max_image_height = (int) $height;
}
function upload($filename='', $accept_type='', $extention='') {
$this->acceptable_file_types = trim($accept_type); // used by error messages
if (!isset($FILES) || !is_array($FILES[$filename]) || !$_FILES[$filename]['name']) {
$this->error = $this->get_error(0);
$this->accepted = FALSE;
return FALSE;
}
// Copy PHP's global $FILES array to a local array
$this->file = $FILES[$filename];
$this->file['file'] = $filename;
// Initialize empty array elements
if (!isset($this->file['extention'])) $this->file['extention'] = "";
if (!isset($this->file['type'])) $this->file['type'] = "";
if (!isset($this->file['size'])) $this->file['size'] = "";
if (!isset($this->file['width'])) $this->file['width'] = "";
if (!isset($this->file['height'])) $this->file['height'] = "";
if (!isset($this->file['tmp_name'])) $this->file['tmp_name'] = "";
if (!isset($this->file['raw_name'])) $this->file['raw_name'] = "";
// test max size
if($this->max_filesize && ($this->file["size"] > $this->max_filesize)) {
$this->error = $this->get_error(1);
$this->accepted = FALSE;
return FALSE;
}
if(stristr($this->file["type"], "image")) {
/ IMAGES /
$image = getimagesize($this->file["tmp_name"]);
$this->file["width"] = $image[0];
$this->file["height"] = $image[1];
// test max image size
if(($this->max_image_width || $this->max_image_height) && (($this->file["width"] > $this->max_image_width) || ($this->file["height"] > $this->max_image_height))) {
$this->error = $this->get_error(2);
$this->accepted = FALSE;
return FALSE;
}
// Image Type is returned from getimagesize() function
switch($image[2]) {
case 1:
$this->file["extention"] = ".gif"; break;
case 2:
$this->file["extention"] = ".jpg"; break;
case 3:
$this->file["extention"] = ".png"; break;
case 4:
$this->file["extention"] = ".swf"; break;
case 5:
$this->file["extention"] = ".psd"; break;
case 6:
$this->file["extention"] = ".bmp"; break;
case 7:
$this->file["extention"] = ".tif"; break;
case 8:
$this->file["extention"] = ".tif"; break;
default:
$this->file["extention"] = $extention; break;
}
} elseif(!ereg("(.)([a-z0-9]{3,5})$", $this->file["name"]) && !$extention) {
// Try and autmatically figure out the file type
// For more on mime-types: http://httpd.apache.org/docs/mod/mod_mime_magic.html
switch($this->file["type"]) {
case "text/plain":
$this->file["extention"] = ".txt"; break;
case "text/richtext":
$this->file["extention"] = ".txt"; break;
default:
break;
}
} else {
$this->file["extention"] = $extention;
}
// check to see if the file is of type specified
if($this->acceptable_file_types) {
if(trim($this->file["type"]) && stristr($this->acceptable_file_types, $this->file["type"])) {
$this->accepted = TRUE;
} else {
$this->accepted = FALSE;
$this->error = $this->get_error(3);
}
} else {
$this->accepted = TRUE;
}
return (bool) $this->accepted;
}
function save_file($path, $overwrite_mode="1"){
if ($this->error) {
return false;
}
if ($path[strlen($path)-1] != "/") {
$path = $path . "/";
}
$this->path = $path;
$copy = "";
$n = 1;
$success = false;
if($this->accepted) {
// Clean up file name (only lowercase letters, numbers and underscores)
$this->file["name"] = ereg_replace("[a-z0-9.]", "", str_replace(" ", "", str_replace("%20", "_", strtolower($this->file["name"]))));
// Clean up text file breaks
if(stristr($this->file["type"], "text")) {
$this->cleanup_text_file($this->file["tmp_name"]);
}
// get the raw name of the file (without its extenstion)
if(ereg("(.)([a-z0-9]{2,5})$", $this->file["name"])) {
$pos = strrpos($this->file["name"], ".");
if(!$this->file["extention"]) {
$this->file["extention"] = substr($this->file["name"], $pos, strlen($this->file["name"]));
}
$this->file['raw_name'] = substr($this->file["name"], 0, $pos);
} else {
$this->file['raw_name'] = $this->file["name"];
if ($this->file["extention"]) {
$this->file["name"] = $this->file["name"] . $this->file["extention"];
}
}
switch((int) $overwrite_mode) {
case 1: // overwrite mode
if (@copy($this->file["tmp_name"], $this->path . $this->file["name"])) {
$success = true;
} else {
$success = false;
$this->error = $this->get_error(5);
}
break;
case 2: // create new with incremental extention
while(file_exists($this->path . $this->file['raw_name'] . $copy . $this->file["extention"])) {
$copy = "_copy" . $n;
$n++;
}
$this->file["name"] = $this->file['raw_name'] . $copy . $this->file["extention"];
if (@copy($this->file["tmp_name"], $this->path . $this->file["name"])) {
$success = true;
} else {
$success = false;
$this->error = $this->get_error(5);
}
break;
default: // do nothing if exists, highest protection
if(file_exists($this->path . $this->file["name"])){
$this->error = $this->get_error(4);
$success = false;
} else {
if (@copy($this->file["tmp_name"], $this->path . $this->file["name"])) {
$success = true;
} else {
$success = false;
$this->error = $this->get_error(5);
}
}
break;
}
if(!$success) { unset($this->file['tmp_name']); }
return (bool) $success;
} else {
$this->error = $this->get_error(3);
return FALSE;
}
}
/**
string get_error(int error_code);
Gets the correct error message for language set by constructor
@ error_code (int) error code
*/
function get_error($error_code='') {
$error_message = array();
$error_code = (int) $error_code;
switch ( $this->language ) {
// English
default:
$error_message[0] = "No file was uploaded";
$error_message[1] = "Maximum file size exceeded. File may be no larger than " . $this->max_filesize/1000 . " KB (" . $this->max_filesize . " bytes).";
$error_message[2] = "Maximum image size exceeded. Image may be no more than " . $this->max_image_width . " x " . $this->max_image_height . " pixels.";
$error_message[3] = "Only " . str_replace("|", " or ", $this->acceptable_file_types) . " files may be uploaded.";
$error_message[4] = "File '" . $this->path . $this->file["name"] . "' already exists.";
// $error_message[5] = "<font face=verdana,arial,helvetica size=2 color=blue><br>Oops</font>. Unable to copy the file, because it probably already exists, to '" . $this->path . "'";
$error_message[5] = "<font face=verdana,arial,helvetica size=2 color=blue><br>Oops</font>. Unable to copy the file - it is probably already in the online folder.";
break;
}
// for backward compatability:
$this->errors[$error_code] = $error_message[$error_code];
return $error_message[$error_code];
}
/**
void cleanup_text_file (string file);
Convert Mac and/or PC line breaks to UNIX by opening
and rewriting the file on the server
@ file (string) Path and name of text file
/
function cleanup_text_file($file){
// chr(13) = CR (carridge return) = Macintosh
// chr(10) = LF (line feed) = Unix
// Win line break = CRLF
$new_file = '';
$old_file = '';
$fcontents = file($file);
while (list ($line_num, $line) = each($fcontents)) {
$old_file .= $line;
$new_file .= str_replace(chr(13), chr(10), $line);
}
if ($old_file != $new_file) {
// Open the uploaded file, and re-write it with the new changes
$fp = fopen($file, "w");
fwrite($fp, $new_file);
fclose($fp);
}
}
}
USAGE:
// Create a new instance of the class
$my_uploader = new uploader;
// OPTIONAL: set the max filesize of uploadable files in bytes
$my_uploader->max_filesize(90000);
// OPTIONAL: if you're uploading images, you can set the max pixel dimensions
$my_uploader->max_image_size(150, 300); // max_image_size($width, $height)
// UPLOAD the file
$my_uploader->upload("userfile", "", ".jpg");
// MOVE THE FILE to its final destination
// $mode = 1 :: overwrite existing file
// $mode = 2 :: rename new file if a file
// with the same name already
// exists: file.txt becomes file_copy0.txt
// $mode = 3 :: do nothing if a file with the
// same name already exists
$my_uploader->save_file("/your/web/dir/fileupload_dir", int $mode);
// Check if everything worked
if ($my_uploader->error) {
echo $my_uploader->error . "<br>";
} else {
// Successful upload!
$file_name = $my_uploader->file['name'];
print($file_name . " was <font face=verdana,arial,helvetica size=2 color=blue>successfully</font> uploaded!");
}
?>