|
Server : Apache/2.4.62 System : FreeBSD fbsdweb2.web.rcn.net 14.1-RELEASE FreeBSD 14.1-RELEASE releng/14.1-n267679-10e31f0946d8 GENERIC amd64 User : www ( 80) PHP Version : 8.3.8 Disable Function : NONE Directory : /domains/simes/unused/fCMSBackend/includes/classes/ |
Upload File : |
<?php
/**
*
* class uploader - File Upload Helper
*
* @copyright 2002, 2005
* @author David Fox, Dave Tufts
* @version 3.1
* @last_update 2005-09-06
* @requires PHP 4.1 or higher
*
* @changes v3.1 - edited Swedish text by Birger Eriksson
* @changes v3.0 - updated comments for phpdoc
* @changes v2.16 - Added Swedish (se) error messaging
* @changes v2.15 - Added Danish (da) error messaging
* @changes v2.14 - Edited acceptable_file_types checks to be more lenient
* @changes v2.13 - Added Spanish (es) and Norwegian (no) error messaging, converted all non-valid HTML language chars to named entities
* @changes v2.12 - Added Finnish (fi) error messaging
* @changes v2.11 - Fixed bug if $this->save_file::$path is ""
* @changes v2.10 - Added var $path to class definition
* @changes v2.9 - Updated error_message[5] for NL (Dutch)
* @changes v2.8 - Cleaned up Italian error messaging (thanks to Maurizio Lemmo - http://www.tenzione.it/ )
* @changes v2.7 - Added new error code [5] to save_file() method, fixed minor bug if unable to write to upload directory
* @changes v2.6 - Added $this->acceptable_file_types. Fixed minor bug fix in upload() - if file 'type' is null
* @changes v2.5.2 - Added Italian (it) error messgaing
* @changes v2.5.1 - Added German (de) and Dutch (nl) error messgaing
* @changes v2.4 - Added error messgae language preferences
* @changes v2.3.1 - Bugfix for upload $path in $this->save_file()
* @changes v2.3 - Initialized all variables (compatibale with PHP error notices)
* @changes v2.2 - Changed ereg() to stristr() whenever possible
*
* Language specific error messaging:
* + [fr] Frank from http://www.ibigin.com - initial code and French text
* + [de] lmg from http://www.kishalmi.net - German text
* + [nl] Andre, [email protected] - Dutch text
* + [it] Enrico Valsecchi http://www.hostyle.it <[email protected]> - Italian text
* + [fi] Dotcom Media Solutions, http://www.dotcom.ms - Finnish text
* + [es] Alejandro Ramirez <[email protected]> - Spanish text
* + [no] Sigbjorn Eide <[email protected]> - Norwegian text
* + [da] Thomas Hannibal http://hannibalsoftware.dk/ - Danish Text
* + [se] Birger Eriksson, PCK art - Swedish Text
*
* Error code: available in multiple languages
* + [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] - "Permission denied. Unable to copy file"
*
*/
class uploader {
var $file;
var $path;
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;
/**
* uploader - Class constructor, sets error messaging language preference
*
* @param string language defaults to en (English).
* @return object
*
*/
function uploader ( $language = 'en' ) {
$this->language = strtolower($language);
$this->error = '';
}
/**
* max_filesize - Set the maximum file size in bytes ($size), allowable by the object.
*
* NOTE: PHP's configuration file also can control the maximum upload size, which is set to 2 or 4
* megs by default. To upload larger files, you'll have to change the php.ini file first.
*
* @param int size file size in bytes
* @return void
*
*/
function max_filesize($size){
$this->max_filesize = (int) $size;
}
/**
* max_image_size- Sets the maximum pixel dimensions.
*
* Will only be checked if the uploaded file is an image
*
* @param int width maximum pixel width of image uploads
* @param int height maximum pixel height of image uploads
* @return void
*
*/
function max_image_size($width, $height){
$this->max_image_width = (int) $width;
$this->max_image_height = (int) $height;
}
/**
* upload - Checks if the file is acceptable and uploads it to PHP's default upload diretory
*
* @param filename (string) form field name of uploaded file
* @param accept_type (string) acceptable mime-types
* @param extension (string) default filename extenstion
* @return bool
*
*/
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"]) || stristr($this->file["type"], $this->acceptable_file_types)) ) {
$this->accepted = TRUE;
} else {
$this->accepted = FALSE;
$this->error = $this->get_error(3);
}
} else {
$this->accepted = TRUE;
}
return (bool) $this->accepted;
}
/**
* save_file - Cleans up the filename, copies the file from PHP's temp location to $path,
*
* save_file() also checks the overwrite_mode and renames the file if needed
*
* overwrite_mode:
* + 1 = overwrite files with the same name
* + 2 = rename files with the same name.
* + 3 = do nothing if file name already exists
*
* overwrite_mode 2 works like this:
* file.txt is uploaded
* another 'file.txt' is uploaded, and renamed file_copy0.txt
* another 'file.txt' is uploaded, and renamed file_copy1.txt
*
*
* @param string path File path to your upload directory
* @param int overwrite_mode Must be 1, 2, or 3
* @param array extlist Allowed extenstions
* @return bool
*
*/
function save_file ($path, $overwrite_mode="3", $extlist) {
if ($this->error) {
return false;
}
if (strlen($path)>0) {
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"];
}
}
// Check the extension
$extention = $this->file ['extention'];
if (substr ($extention, 0, 1) == ".") {
// remove leading "."
$extention = substr ($extention, 1);
}
$ext_ok = True;
if ($extlist) {
if (! $extention) $ext_ok = False;
else
if (! in_array ($extention, $extlist)) $ext_ok = False;
}
if (! $ext_ok) {
$this->error = $this->get_error (3);
return False;
}
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;
}
}
/**
* get_error - Gets the correct error message for language set by constructor
*
* @param int error_code
* @return string
*
*/
function get_error($error_code='') {
$error_message = array();
$error_code = (int) $error_code;
switch ( $this->language ) {
// French (fr)
case 'fr':
$error_message[0] = "Aucun fichier n'a été envoyé";
$error_message[1] = "Taille maximale autorisée dépassée. Le fichier ne doit pas être plus gros que " . $this->max_filesize/1000 . " Ko (" . $this->max_filesize . " octets).";
$error_message[2] = "Taille de l'image incorrecte. L'image ne doit pas dépasser " . $this->max_image_width . " pixels de large sur " . $this->max_image_height . " de haut.";
$error_message[3] = "Type de fichier incorrect. Seulement les fichiers de type " . str_replace("|", " or ", $this->acceptable_file_types) . " sont autorisés.";
$error_message[4] = "Fichier '" . $this->path . $this->file["name"] . "' déjá existant, écrasement interdit.";
$error_message[5] = "La permission a nié. Incapable pour copier le fichier á '" . $this->path . "'";
break;
// German (de)
case 'de':
$error_message[0] = "Es wurde keine Datei hochgeladen";
$error_message[1] = "Maximale Dateigrösse überschritten. Datei darf nicht grösser als " . $this->max_filesize/1000 . " KB (" . $this->max_filesize . " bytes) sein.";
$error_message[2] = "Maximale Bildgrösse überschritten. Bild darf nicht grösser als " . $this->max_image_width . " x " . $this->max_image_height . " pixel sein.";
$error_message[3] = "Nur " . str_replace("|", " oder ", $this->acceptable_file_types) . " Dateien dürfen hochgeladen werden.";
$error_message[4] = "Datei '" . $this->path . $this->file["name"] . "' existiert bereits.";
$error_message[5] = "Erlaubnis hat verweigert. Unf&amul;hig, Akte zu '" . $this->path . "'";
break;
// Dutch (nl)
case 'nl':
$error_message[0] = "Er is geen bestand geupload";
$error_message[1] = "Maximum bestandslimiet overschreden. Bestanden mogen niet groter zijn dan " . $this->max_filesize/1000 . " KB (" . $this->max_filesize . " bytes).";
$error_message[2] = "Maximum plaatje omvang overschreven. Plaatjes mogen niet groter zijn dan " . $this->max_image_width . " x " . $this->max_image_height . " pixels.";
$error_message[3] = "Alleen " . str_replace("|", " of ", $this->acceptable_file_types) . " bestanden mogen worden geupload.";
$error_message[4] = "Bestand '" . $this->path . $this->file["name"] . "' bestaat al.";
$error_message[5] = "Toestemming is geweigerd. Kon het bestand niet naar '" . $this->path . "' copieren.";
//$error_message[5] = "Toestemming ontkende. Onbekwaam dossier aan '" . $this->path . "'";
break;
// Italian (it)
case 'it':
$error_message[0] = "Il file non e' stato salvato";
$error_message[1] = "Il file e' troppo grande. La dimensione massima del file e' " . $this->max_filesize/1000 . " Kb (" . $this->max_filesize . " bytes).";
$error_message[2] = "L'immagine e' troppo grande. Le dimensioni massime non possono essere superiori a " . $this->max_image_width . " pixel di larghezza per " . $this->max_image_height . " d'altezza.";
$error_message[3] = "Il tipo di file non e' valido. Solo file di tipo " . str_replace("|", " o ", $this->acceptable_file_types) . " sono autorizzati.";
$error_message[4] = "E' gia' presente un file con nome " . $this->path . $this->file["name"];
$error_message[5] = "Permesso negato. Impossibile copiare il file in '" . $this->path . "'";
break;
// Finnish
case 'fi':
$error_message[0] = "Tiedostoa ei l&amul;hetetty.";
$error_message[1] = "Tiedosto on liian suuri. Tiedoston koko ei saa olla yli " . $this->max_filesize/1000 . " KB (" . $this->max_filesize . " tavua).";
$error_message[2] = "Kuva on liian iso. Kuva ei saa olla yli " . $this->max_image_width . " x " . $this->max_image_height . " pikseli&amul;.";
$error_message[3] = "Vain " . str_replace("|", " tai ", $this->acceptable_file_types) . " tiedostoja voi tallentaa kuvapankkiin.";
$error_message[4] = "Tiedosto '" . $this->path . $this->file["name"] . "' on jo olemassa.";
$error_message[5] = "Ei k&amul;yttöoikeutta. Tiedostoa ei voi kopioida hakemistoon '" . $this->path . "'";
break;
// Spanish
case 'es':
$error_message[0] = "No se subió ningún archivo.";
$error_message[1] = "Se excedió el tamaño máximo del archivo. El archivo no puede ser mayor a " . $this->max_filesize/1000 . " KB (" . $this->max_filesize . " bytes).";
$error_message[2] = "Se excedieron las dimensiones de la imagen. La imagen no puede medir más de " . $this->max_image_width . " (w) x " . $this->max_image_height . " (h) pixeles.";
$error_message[3] = "El tipo de archivo no es válido. Sólo los archivos " . str_replace("|", " o ", $this->acceptable_file_types) . " son permitidos.";
$error_message[4] = "El archivo '" . $this->path . $this->file["name"] . "' ya existe.";
$error_message[5] = "Permiso denegado. No es posible copiar el archivo a '" . $this->path . "'";
break;
// Norwegian
case 'no':
$error_message[0] = "Ingen fil ble lastet opp.";
$error_message[1] = "Max filstørrelse ble oversteget. Filen kan ikke v�re større ennn " . $this->max_filesize/1000 . " KB (" . $this->max_filesize . " byte).";
$error_message[2] = "Max bildestørrelse ble oversteget. Bildet kan ikke v�re større enn " . $this->max_image_width . " x " . $this->max_image_height . " piksler.";
$error_message[3] = "Bare " . str_replace("|", " tai ", $this->acceptable_file_types) . " kan lastes opp.";
$error_message[4] = "Filen '" . $this->path . $this->file["name"] . "' finnes fra før.";
$error_message[5] = "Tilgang nektet. Kan ikke kopiere filen til '" . $this->path . "'";
break;
// Danish
case 'da':
$error_message[0] = "Ingen fil blev uploaded";
$error_message[1] = "Den maksimale filst�rrelse er overskredet. Filerne m� ikke v�re st�rre end " . $this->max_filesize/1000 . " KB (" . $this->max_filesize . " bytes).";
$error_message[2] = "Den maksimale billedst�rrelse er overskredet. Billeder m� ikke v�re st�rre end " . $this->max_image_width . " x " . $this->max_image_height . " pixels.";
$error_message[3] = "Kun " . str_replace("|", " or ", $this->acceptable_file_types) . " kan uploades.";
$error_message[4] = "Filen '" . $this->path . $this->file["name"] . "' eksisterer allerede.";
$error_message[5] = "Adgang n�gtet! Er ikke i stand til at kopiere filen til '" . $this->path . "'";
break;
// Swedish
case 'se':
$error_message[0] = "Ingen fil laddades upp";
$error_message[1] = "Den maximala filstorleken överskreds. Filer får inte vara större än " . $this->max_filesize/1000 . " KB (" . $this->max_filesize . " bytes).";
$error_message[2] = "Den maximala bildstorleken överskreds. Bilder får inte vara större än " . $this->max_image_width . " x " . $this->max_image_height . " pixels.";
$error_message[3] = "Endast " . str_replace("|", " or ", $this->acceptable_file_types) . " får laddas upp.";
$error_message[4] = "Filen '" . $this->path . $this->file["name"] . "' finns redan.";
$error_message[5] = "Tillgång nekad! Kan inte kopiera filen till '" . $this->path . "'";
break;
// HTTP Error Code
case 'fb_http':
$error_message[0] = "417 Expectation Failed";
$error_message[1] = "406 Not Acceptable";
$error_message[2] = "406 Not Acceptable";
$error_message[3] = "415 Unsupported Media Type";
$error_message[4] = "412 Precondition Failed";
$error_message[5] = "403 Forbidden";
break;
// 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] = "Permission denied. Unable to copy file to '" . $this->path . "'";
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
*
* @param 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);
}
}
}
/*
<license>
///// fileupload-class.php /////
Copyright (c) 1999, 2002, 2005
Dave Tufts, http://imarc.net; David Fox, Angryrobot Productions
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
3. Neither the name of author nor the names of its contributors
may be used to endorse or promote products derived from this
software without specific prior written permission.
DISCLAIMER:
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.
</license>
*/
?>