* * * This software is protected by copyright, please * read the file COPYRIGHT. * This program is distributed in the hope that it * will be useful, but without any warranty; without * even the implied warranty of merchantability or * fitness for a particular purpose. Please * read the file LICENCE. * * Fichier package.upload.php * Ce fichier contient les classe de gestion d'upload * Il est a inclure dans votre script avec l'instruction includePackage(upload.php) * * @author Rooty * @since 2005/03/09 * @link www.rooty.me * @version 0.3 * @package package * @subpackage upload * @copyright Copyright © 2009-2018, Rooty */ if ( !defined('SYSTEM_IN') ) { die("Hacking attempt"); } /** * Temps autorisé pour l'upload */ define('CONF_UPLOAD_TIME', 10000); /** * Permet la gestion des limites d'upload * Cette classe n'est pas à utiliser directement
* Voir ses extention: * - UploadToDir * - UploadToDb * Le fichier est a inclure dans votre script avec l'instruction includePackage(upload.php) * @package package * @subpackage upload */ class UploadLimit { /**#@+ * @access private */ /** * @var chaine * @desc identifiant du noeud de limitation */ var $nid=0; /** * @var chaine * @desc objet treeNode... */ var $treeNode=null; /** * @var chaine * @desc identifiant de l'utilisateur courant */ var $uid=0; /**#@-*/ /** *Constructeur de la classe Upload PHP4 * * @access public * @param chaine nom du champ */ function UploadLimit($nid="", $uid="") { $this->__construct($nid, $uid); } /** *Constructeur de la classe Upload PHP5 * * @access public * @param chaine nom du champ */ function __construct($nid="", $uid="") { $this->setNid( (($nid!="") && (is_numeric($nid)))?$nid:nid() ); $this->setUid( (($uid!="") && (is_numeric($uid)))?$uid:nid() ); } /** * setteur du nid, indique a quel endroit on prend une limitation * @access public * @param entier id du noeud */ function setNid($id) { $this->nid=$id; $this->treeNode=$GLOBALS["SYSTEM_MANAGER"]["TREE_NODE"]->createInstance($id); } /** * getteur du nid, indique a quel endroit on prend une limitation * @access public * @param entier id du noeud */ function getNid() { return $this->nid; } /** * setteur de l'uid, indique a quel endroit on prend une limitation * @access public * @param entier id du noeud */ function setUid($id) { $this->uid=$id; } /** * getteur de l'uid, indique a quel endroit on prend une limitation * @access public * @param entier id du noeud */ function getUid() { return $this->uid; } /** * recupere l'espace utilisé pour le noeud * @access protected * @todo modifier pour que la gestion se fasse sur l'oid * @param entier id du noeud * @param entier id de l'utilisateur * @param entier id du noeud */ function getUseSpace($nid="", $uid="") { $nid=(isset($nid) && is_numeric($nid))?$nid:$this->getNid(); // par défaut le nid de l'obj $uid=(isset($uid) && is_numeric($uid))?$uid:0; // par défaut 0 //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $treeNode=$GLOBALS["SYSTEM_MANAGER"]["TREE_NODE"]->createInstance( $nid ); $tabNode=$treeNode->getSonArray(); $tabNode[]=$treeNode->getId(); /* Consultation dans la table des entête de fichier du poid des docs pour ces noeuds */ $sql="SELECT sum(file_size) as sum FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."file WHERE "; /* Calcul des opt pour les noeuds */ $sql.="( file_nid=".$this->getNid(); if (count($tabNode)>1) { for($i=0; $isql_query($sql); if ($GLOBALS["SYSTEM_DATABASE_CONN"]->sql_numrows()>0) { $row = $GLOBALS['SYSTEM_DATABASE_CONN']->sql_fetchrow(); return $row["sum"]; }else{ return 0; } } /** * recupere la taille affectée à un utilisateur *fonctionne récursivement si la limite utilisateur n'est pas fixée sur le noeud mm
*consulte la table user_space * @access public * @param entier id du noeud * @return entier taille pour l'utilisateur, ou faux si aucune affectée */ function getMaxSpaceForUser($nid="", $uid=0) { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $nid=($nid!="")?$nid:$this->getNid(); $sql ="SELECT user_space FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."user_space WHERE "; $sql.=" user_space_nid=".$nid." AND ( user_space_uid=".$this->getUid()." OR user_space_uid=0 ) ORDER BY user_space_uid DESC"; # l'ordre permet de gérer si l'uid de l'utilisateur existe /* gestion du resultat */ $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql); if ($GLOBALS["SYSTEM_DATABASE_CONN"]->sql_numrows()>0) { for ($i=0; $i<$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_numrows(); $i++) { $row = $GLOBALS['SYSTEM_DATABASE_CONN']->sql_fetchrow(); } return $row["user_space"]; }else{ if ($nid!=0) { $Node=$this->treeNode->getNodeId($nid); return $this->getMaxSpaceForUser( $Node->getIdPere() ); }else{ return false; } } } /** * recupere la taille affectée à un utilisateur *fonctionne récursivement si la limite utilisateur n'est pas fixée sur le noeud mm
*consulte la table user_space * @access public * @param entier id du noeud * @return entier taille pour l'utilisateur, ou faux si aucune affectée */ function getSingleMaxSpaceForUser($nid="", $uid=0) { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $nid=($nid!="")?$nid:$this->getNid(); $sql ="SELECT user_space FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."user_space WHERE "; $sql.=" user_space_nid=".$nid." AND ( user_space_uid=".$uid." ) ORDER BY user_space_uid DESC"; # l'ordre permet de gérer si l'uid de l'utilisateur existe /* gestion du resultat */ $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql); if ($GLOBALS["SYSTEM_DATABASE_CONN"]->sql_numrows()>0) { for ($i=0; $i<$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_numrows(); $i++) { $row = $GLOBALS['SYSTEM_DATABASE_CONN']->sql_fetchrow(); } return $row["user_space"]; }else{ return false; } } /** * recupere la taille affectée à un noeud *fonctionne récursivement si la limite n'est pas fixée sur le noeud mm
*consulte la table user_space * @access public * @param entier id du noeud * @return entier taille pour l'utilisateur, ou faux si aucune affectée */ function getMaxSpaceForNode($nid="") { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $nid=($nid!="")?$nid:$this->getNid(); $sql ="SELECT node_space FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."node_space WHERE "; $sql.=" node_space_nid=".$nid." "; # l'ordre permet de gérer si l'uid de l'utilisateur existe /* gestion du resultat */ $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql); if ($GLOBALS["SYSTEM_DATABASE_CONN"]->sql_numrows()>0) { for ($i=0; $i<$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_numrows(); $i++) { $row = $GLOBALS['SYSTEM_DATABASE_CONN']->sql_fetchrow(); } return $row["node_space"]; }else{ if ($nid!=0) { $Node=$this->treeNode->getNodeId($nid); return $this->getMaxSpaceForNode( $Node->getIdPere() ); }else{ return false; } } } /** * recupere la taille affectée à un noeud *fonctionne récursivement si la limite n'est pas fixée sur le noeud mm
*consulte la table user_space * @access public * @param entier id du noeud * @return entier taille pour l'utilisateur, ou faux si aucune affectée */ function getSingleMaxSpaceForNode($nid="") { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $nid=($nid!="")?$nid:$this->getNid(); $sql ="SELECT node_space FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."node_space WHERE "; $sql.=" node_space_nid=".$nid." "; # l'ordre permet de gérer si l'uid de l'utilisateur existe /* gestion du resultat */ $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql); if ($GLOBALS["SYSTEM_DATABASE_CONN"]->sql_numrows()>0) { for ($i=0; $i<$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_numrows(); $i++) { $row = $GLOBALS['SYSTEM_DATABASE_CONN']->sql_fetchrow(); } return $row["node_space"]; }else{ return false; } } /** * recupere la taille affectée à un noeud *fonctionne récursivement si la limite n'est pas fixée sur le noeud mm
*consulte la table node_space * @access public * @param entier id du noeud * @return entier taille pour l'utilisateur, ou faux si aucune affectée */ function isSetNodeLimit($nid="") { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $nid=($nid!="")?$nid:$this->getNid(); $sql ="SELECT node_space FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."node_space WHERE "; $sql.=" node_space_nid=".$nid." "; # l'ordre permet de gérer si l'uid de l'utilisateur existe /* gestion du resultat */ $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql); if ($GLOBALS["SYSTEM_DATABASE_CONN"]->sql_numrows()>0) { return true; }else{ return false; } } /** * recupere la taille affectée à un noeud *fonctionne récursivement si la limite n'est pas fixée sur le noeud mm
*consulte la table user_space * @access public * @param entier id du noeud * @return entier taille pour l'utilisateur, ou faux si aucune affectée */ function getDownMaxSpaceForNode(&$tree, $nid="") { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $nid=($nid!="")?$nid:$this->getNid(); /* Génération de l'option */ $opt=""; $tab=$tree->getSonOfIdPereArray($nid); $tabtmp=$tree->getSonOfIdPereArray($nid); /* on exploite tous les sous noeud */ while (count($tabtmp)>0) { $tabtoTest=array(); $tab=array_merge($tab, $tabtmp); for ($i=0; $igetSonOfIdPereArray($tabtmp[$i]), $tabtoTest); } $tabtmp=$tabtoTest; } $tab=array_merge($tab, array($nid)); $opt=""; for ($i=0; $i0) $opt.=" OR "; $opt.=" node_space_nid=".$tab[$i]; } $sql ="SELECT * FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."node_space WHERE "; $sql.=" ".$opt; # l'ordre permet de gérer si l'uid de l'utilisateur existe /* gestion du resultat */ $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql); if ($GLOBALS["SYSTEM_DATABASE_CONN"]->sql_numrows()==0 || (count($tab)==0) ) return 0; // Alimentation du tableau de résultat for ($i=0; $i<$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_numrows(); $i++) { $row[$i] = $GLOBALS['SYSTEM_DATABASE_CONN']->sql_fetchrow(); } return $this->treeTabSizeForNid($row, $tree, $nid); } // Traitement en fonction de l'arbo function treeTabSizeForNid(&$tabRow, &$tree, $nid) { $val=0; $tabSonOfNid=$tree->getSonOfIdPereArray($nid); // on recupere la valeur associée for ($j=0; $jtreeTabSizeForNid($tabRow, $tree, $tabSonOfNid[$i]); } return $val; } /** * recupere la taille restante pour 1 noeud &&|| 1 utilisateur *on indiquera ici si on fonctionne en mode: * - user (le poids s'applique pour l'utilisateur)
* - node (le poids est relatif a l'arbo uniquement) * * @access public * @param chaine "NODE" || "USER" * @return entier taille pour l'utilisateur, ou faux si aucune affectée */ function getFreeSpace($mode="NODE") { $nid=(isset($nid) && is_numeric($nid))?$nid:$this->getNid(); // par défaut le nid de l'obj if ($mode=="NODE"){ $useSpace =$this->getUseSpace($nid, ""); $maxSpaceNode =$this->getMaxSpaceForNode(); /* on renvoi la valeur min entre quota sur noeud ou utilisateur */ return ($maxSpaceNode-$useSpace); } elseif ($mode=="USER"){ $maxSpaceNode =$this->getMaxSpaceForNode(); $useUserSpace =$this->getUseSpace( $nid, $this->getUid() ); // spaceUsed By user $useNodeSpace =$this->getUseSpace( $nid, "" ); // spaceUsed By node $maxSpaceUser =$this->getMaxSpaceForUser(); /* on renvoi la valeur min entre quota sur noeud ou utilisateur */ return ( ($maxSpaceNode-$useNodeSpace)<($maxSpaceUser-$useUserSpace) )?($maxSpaceNode-$useNodeSpace):($maxSpaceUser-$useUserSpace); } } /** * la taille du fichier est valide pour la communautée (et l'utilisateur si celui-ci remplis) *si on remplis l'utilisateur, on passe en mode, utilisateur propriétaire du fichier * @access public * @param entier taille du fichier * @param chaine NODE || USER (gestion de la propriété pour 1 utilisateur ou 1 noeud) * @return entier taille pour l'utilisateur, ou faux si aucune affectée */ function isValidSize($size, $mode="NODE") { return ( $this->getFreeSpace($mode)<$size )?true:false; } /** * ajoute la creation d'une limite sur utilisateur * @access public * @param entier id du noeud * @param entier id de l'utilisateur * @param limite * @return entier taille pour l'utilisateur, ou faux si aucune affectée */ function createUserLimit($nid, $uid, $limit) { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $sql="INSERT INTO ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."user_space (user_space_uid, user_space_nid, user_space) VALUES (".$uid.", ".$nid.", ".$limit.")"; /* gestion du resultat */ $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql); } /** * modification d'une limite sur utilisateur * @access public * @param entier id du noeud * @param entier id de l'utilisateur * @param limite * @return entier taille pour l'utilisateur, ou faux si aucune affectée */ function updateUserLimit($nid, $uid, $limit) { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $sql="UPDATE ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."user_space SET user_space=".$limit." WHERE user_space_uid=".$uid." AND user_space_nid=".$nid; /* gestion du resultat */ $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql); } /** * modification d'une limite sur utilisateur * @access public * @param entier id du noeud * @param entier id de l'utilisateur * @param limite * @return entier taille pour l'utilisateur, ou faux si aucune affectée */ function deleteUserLimit($nid, $uid) { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $sql="DELETE FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."user_space WHERE user_space_uid=".$uid." AND user_space_nid=".$nid; /* gestion du resultat */ $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql); } /** * ajoute la creation d'une limite sur noeud * @access public * @param entier id du noeud * @param entier id de l'utilisateur * @param limite * @return entier taille pour l'utilisateur, ou faux si aucune affectée */ function createNodeLimit($nid, $limit) { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $sql="INSERT INTO ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."node_space (node_space_nid, node_space) VALUES (".$nid.", ".$limit.")"; /* gestion du resultat */ $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql); } /** * modification d'une limite sur noeud * @access public * @param entier id du noeud * @param entier id de l'utilisateur * @param limite * @return entier taille pour l'utilisateur, ou faux si aucune affectée */ function updateNodeLimit($nid, $limit) { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $sql="UPDATE ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."node_space SET node_space=".$limit." WHERE node_space_nid=".$nid; /* gestion du resultat */ $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql); } /** * destruction d'une limite sur noeud * @access public * @param entier id du noeud * @param entier id de l'utilisateur * @param limite * @return entier taille pour l'utilisateur, ou faux si aucune affectée */ function deleteNodeLimit($nid) { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $sql="DELETE FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."node_space WHERE node_space_nid=".$nid; /* gestion du resultat */ $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql); } } /** * Permet la gestion des upload * Cette classe n'est pas à utiliser directement
* Voir ses extention: * - UploadToDir * - UploadToDb * Le fichier est a inclure dans votre script avec l'instruction includePackage(upload.php) * @package package * @subpackage file */ class Upload { /**#@+ * @access private */ /** * @var chaine * @desc entier gére la limitation sur le noeud ou l'utilisateur */ var $limitOwner=0; /** * @var chaine * @desc nom de l'élément du formulaire */ var $fieldName="upload"; /** * @var chaine * @desc nom du fichier (est transformé si celui-ci existe) (fonctionnement fichier) */ var $fileName; /**#@-*/ // // Constructor // /** *Constructeur de la classe Upload PHP4 * * @access public * @param chaine nom du champ */ function Upload($fieldName="upload") { $this->__construct($fieldName); } /** *Constructeur de la classe Upload PHP5 * * @access public * @param chaine nom du champ */ function __construct($fieldName="upload") { $this->fieldName=$fieldName; $this->fileName=($this->originalFileName()); $this->setLimitOwner(false); # la gestion des quotas se fé d'abord sur la communautée } /** * getteur du nid, indique a quel endroit on prend une limitation * @access public * @param entier id du noeud */ function getLimitOwner() { return ($this->limitOwner==0)?false:true; } /** * setteur de l'uid, indique a quel endroit on prend une limitation * @access public * @param booleen active la limite de quota sur l'utilisateur... */ function setLimitOwner($bool) { $this->limitOwner=($bool==true)?1:0; } /** * uploadFile:retourne la clé du fichier enregistré... id ou nom... * @access public * @return retourne la clé du fichier enregistré... id ou nom... */ function uploadFile() { return ""; } /** * getFileInfo:retourne un tableau des infos fichier (nom, id, size, type=>extention) * @access public * @return tableau tableau des infos fichier (nom, id, size, type=>extention) */ function getFileInfo($id) { return array(); } /** * getFileContent:retourne les données du fichier * pour l'affichage utiliser printHeaders pour forcer les headers en "application/octet-stream" * @access public * @return data */ function getFileContent($id) { return ""; } /** * removeFile:detruit le fichier correspondant * @access public * @return booleen */ function removeFile($id) { return true; } /** * removeFileFromOid:detruit les fichiers correspondant a l'objet de coordination * @access public * @return booleen */ function removeFileFromOid($oid) { return true; } /** * validfileName:retourne le nom "valide" du fichier * sans caractères spèciaux et avec un seul point dans la chaine. * @access public * @return chaine nom du fichier */ function validfileName() { $s=strtolower($this->fileName); $s=preg_replace('/[^a-z0-9_\-\.]/i', '',$s); //$s=$this->pointReplace($s); return $s; } /** * pointReplace:retourne le nom "valide" du fichier *remplace tous les points en trop sur le nom du fichier * @access public * @return data */ function pointReplace($chaine) { $posdeb= strpos($chaine,"."); $posfin= strlen($chaine); // fin chaine sans le point $chainefin= substr($chaine, $posdeb+1, $posfin); // s'il existe un autre point if (strpos($chainefin,".")==false) { // cas pas d'autre point !!! return $chaine; } else { // cas un autre point existe // -- on remplace le point et on rapelle la fction !! $modif=substr($chaine, 0, $posdeb).$this->PointReplace($chainefin); return $modif; } } /** * extentionFinder:retourne l'extention du fichier *retourne l'extention à partir de la chaine (type "php, html etc.")... * @access public * @return data */ function extentionFinder($chaine) { $posdeb= strpos($chaine,"."); $posfin= strlen($chaine); // fin chaine sans le point c-a-d l'extension $extension= substr($chaine, $posdeb+1, $posfin); return $extension; } /** * formatfileName:a partir du nom du fichier courant propose un nom de fichier *charte le nom de fichier de type nom+"_n"+extention ($this->fileName) *si n existe on a alors il est incrémenté sinon ajouté * @access public * @return booleen */ function formatfileName() { // remarque le fileName de fichier est déjà testé sans carac spéciaux $chaine=$this->fileName; $len=strlen($chaine); $posPoint=strpos($chaine,".",0); // position du point dans la chaine if ($posPoint===false) { $posPoint=$len; $extChaine=""; } else { $extChaine=substr($chaine,$posPoint,($len-$posPoint)); } $fileNameChaine=substr($chaine,0,$posPoint); // récupération de l'indice si existant $boolIndice=false; if ($posPoint>2) { // on recherche "_" if (substr($fileNameChaine,$posPoint-3,1)=="_") { // on essaye de récupérer l'indice if (Is_numeric(substr($fileNameChaine,$posPoint-2,2))) { // cas l'indice existe $indice=substr($fileNameChaine,$posPoint-2,2); $indice++; if ($indice<10) $indice="0".$indice; //fileName de chaine résultant !!! $fileNameChaine=substr($fileNameChaine,0,$posPoint-2).$indice; $boolIndice=true; } } } // cas nouveau fichier sans indice if ($boolIndice==false) { $fileNameChaine.="_01"; } $this->fileName=$fileNameChaine.$extChaine; return true; } /** * originalFileName:durant l'upload donne le nom réel du fichié téléchargé * @access public * @return booleen */ function originalFileName() { if(isset($_FILES[$this->fieldName])) return $_FILES[$this->fieldName]["name"]; else return ""; } /** * isValidPostFile:indique pour le champ de l'objet si un upload à été effectué * @access public * @return booleen */ function isValidPostFile() { if( (isset($_FILES[$this->fieldName]["tmp_name"])) && ($_FILES[$this->fieldName]["tmp_name"]!="none") ) return true; else return false; } /** * setPhpPerms:affecte le permission PHP(si possible) pour le bon déroulement de l'upload * @access public * @return booleen */ function verifPhpPerms() { $retour=0; if ( (ini_get("file_uploads")== false) ) { addError(1, get_class($this), "Les uploads sont interdits et ne peuvent être modifiés-> voir php.ini", __line__, __file__); $retour++; } return $retour; } /** * printHeaders:force le navigateur de l'utilisateur à télécharger le document. * @param chaine nom du fichier * @param entier taille du fichier * @param chaine type du fichier (par défaut:application/octet-stream) * @access public * @return booleen */ function printHeaders($fileName, $fileSize, $fileType="application/octet-stream") { if (!headers_sent()) { header("Pragma: public"); header("Expires: 0"); header("Cache-Control: private"); $filename = basename($fileName); header("Content-Type: $fileType"); header("Content-Disposition: attachment; filename=$filename"); header("Accept-Ranges: bytes"); header("Content-Length: $fileSize"); header ("Content-Description: PHP Generated Data"); return true; }else{ return false; } } /** * affichage du formulaire de saisie * @todo l'affichage devrait avoir une template propre ou un système de bloc permettant de le customiser * @param chaine nom du bloc a utiliser pour l'affichage * @param chaine nom/id du fichier * @param chaine url de redirection pour lire le fichier * @return booleen */ function MxPrintFormUpload($blocPath="upload", $docId="", $urlRead="") { // On affiche le nom $str ="\n"; $str.=''; // On affiche le document if ($docId!="" || $docId==0) { $tabInfo=$this->getFileInfo($docId); if (count($tabInfo)>0) { $str =''; $str.="
'; // Récupération du type de fichier à partir de l'extention // --- recuperation de l'extension $extention= $this->extentionFinder($tabInfo["name"]); $nomIcone = $extention.".png"; $dirImage = $GLOBALS['CONF_DATA_PATH']."data/image/icons/"; if (file_exists($dirImage.strtolower($nomIcone))==true) $img=""; else $img=""; $str.=$img.""; // Fin récupération du picto $str.=''.$tabInfo["name"].'
"; $str.='

:

'; $str.='
'; $str.='
'; $str.='
'; $str.='
'; $str.='
'; $str.='
'; $str.=""; } } $GLOBALS["SYSTEM_TEMPLATE"]->MxBloc($blocPath, "modify", $str); return true; } /** * recupere le chemin de l'icone */ function getImagePath($name) { $extention= $this->extentionFinder($name); $nomIcone = $extention.".png"; $dirImage = $GLOBALS['CONF_DATA_PATH']."data/image/icons/"; if (file_exists($dirImage.strtolower($nomIcone))==true) $img="".$dirImage.$nomIcone.""; else $img="".$dirImage."default.png"; return $img; } } /** * Classe UploadToDb * * Permet la gestion des upload dans une bd
* Le fichier est a inclure dans votre script avec l'instruction includePackage(upload.php) * @package package * @subpackage upload */ class UploadToDb extends Upload { /**#@+ * @access private */ /** * @var entier * @desc taille max des paquets sql (fonctionnement Bd) */ var $maxSqlSize=40000; /** * @var chaine * @desc chemin du repertoire de telechargement (fonctionnement bd) */ var $file_id=0; /**#@-*/ /** *Constructeur de la classe UploadToBd * *

Initialise la classe

* @access public * @param chaine nom du champ * @param entier taille max des paquets sql */ function UploadToDb($fieldName="upload", $maxSqlSize=40000) { $this->__construct($fieldName, $maxSqlSize); } /** *Constructeur de la classe UploadToBd * *

Initialise la classe

* @access public * @param chaine nom du champ * @param entier taille max des paquets sql */ function __construct($fieldName="upload", $maxSqlSize=40000) { parent::__construct($fieldName); $this->maxSqlSize=$maxSqlSize; } /** * uploadFile:retourne la clé du fichier enregistré... (id automatique de la Bd) *se sert des Tables "prefixe systeme"+files et "prefixe systeme"filesdata
*la table "prefixe systeme"files contient:
* - file_id : identifiant auto
* - name : nom du fichier
* - type : extention du fichier
* - size : taille du fichier
*Cette table stocke les infos générales du fichier *la table "prefixe systeme"filedata contient:
* - id : identifiant auto
* - file_id : identifiant du fichier correspondant
* - type : extention du fichier
* - size : taille du fichier
*Cette table stocke les données du fichier sous forme de ligne * la taille de ces lignes est déterminée par maxSqlSize (par défaut 50000) * * @access public * @param entier node id (noeud ou l'upload est effectué) * @param entier object id (objet propriétaire du fichier) * @param chaine fonction pour les test d'upload a NODE || USER si=false -> pas de test... /defaut NODE * @return retourne la clé du fichier enregistré... id de l'enregistrement */ function uploadFile($nid, $oid, $uid="", $mode="NODE") { $uid=($uid=="")?$GLOBALS["SYSTEM_USER_SESSION"]->user->getId():$uid; set_time_limit( CONF_UPLOAD_TIME ); /* préfixe de la table */ //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $boolUploaded=false; /* Récupération de la valeur */ $erreur=0; if ($this->isValidPostFile()) { $tmp=$_FILES[$this->fieldName]["tmp_name"]; /* Vérification de la taille restante */ $uploadLimit=new UploadLimit($nid, $uid); if (filesize($tmp)<$uploadLimit->getFreeSpace($mode) || $mode==false) { // Max packet size if (file_exists($tmp)) $filehandle = fopen($tmp, "rb"); else return false; $query= "INSERT INTO ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."file (file_name, file_type, file_extention, file_size, file_location, file_nid, file_oid, file_uid, file_limit_owner) VALUES('".$this->validfileName()."', '".$_FILES[$this->fieldName]["type"]."', '".$this->extentionFinder($this->validfileName())."', ".filesize($tmp).", 'BD', $nid, $oid, $uid, ".$this->limitOwner.")"; // Execute Query $result = $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($query); $file_id = $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_nextid(); while (!feof ($filehandle)) { $data = base64_encode(fread($filehandle, $this->maxSqlSize)); $query = "INSERT INTO ".$prefixe."filedata (file_id, filedata_data, nid, oid) VALUES($file_id,\"".$data."\", $nid, $oid)"; $result = $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($query); } fclose ($filehandle); $boolUploaded=true; } } return ($boolUploaded==true)?$file_id:false; } /** * getFileInfo:retourne un tableau des infos fichier (nom, id, size, type=>extention) * @access public * @return tableau tableau des infos fichier (nom, id, size, type=>extention) */ function getFileInfo($id) { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $row=array(); if (is_numeric($id) && ($id!=0) ) { $query ="SELECT * from ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."file WHERE file_id=$id"; $result=$GLOBALS['SYSTEM_DATABASE_CONN']->sql_query($query); if($GLOBALS['SYSTEM_DATABASE_CONN']->sql_numrows()>0) { $row = $GLOBALS['SYSTEM_DATABASE_CONN']->sql_fetchrow(); } } return $row; } /** * getFileContent:retourne les données du fichier * pour l'affichage utiliser voir printHeaders * @access public * @return data */ function getFileContent($id, $nid, $oid) { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $data=""; if (is_numeric($id) && ($id!=0) ) { $query ="select file_id, name, type, size from ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."file where file_id='$id'"; $result=$GLOBALS['SYSTEM_DATABASE_CONN']->sql_query($query); if($GLOBALS['SYSTEM_DATABASE_CONN']->sql_numrows()>0) { $row = $GLOBALS['SYSTEM_DATABASE_CONN']->sql_fetchrow(); $GLOBALS['SYSTEM_DATABASE_CONN']->sql_freeresult(); /* recupere les éléments du fichier */ $query = "select file_id, filedata_data from ".$prefixe."filedata where file_id='$id' AND oid=$oid ORDER BY file_id ASC"; $result=$GLOBALS['SYSTEM_DATABASE_CONN']->sql_query($query); if($GLOBALS['SYSTEM_DATABASE_CONN']->sql_numrows()>0) { /* decode les fragments et recombine le fichier */ $data = ""; while ($row = mysql_fetch_array($result)) { $data .= base64_decode($row ["data"]); } $GLOBALS['SYSTEM_DATABASE_CONN']->sql_freeresult(); } } } return $data; } /** * removeFile:detruit le fichier correspondant * pour l'affichage utiliser printHeaders * @access public * @param entier identifiant du fichier * @param entier identifiant du noeud * @param entier identifiant de l'objet * @return booleen */ function removeFile($id, $nid, $oid) { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $row=array(); if (is_numeric($id) && ($id!=0) ) { $query ="DELETE FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."file where file_id='$id' AND oid=$oid"; $result=$GLOBALS['SYSTEM_DATABASE_CONN']->sql_query($query); $query ="DELETE FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."filedata where file_id='$id' AND oid=$oid"; $result=$GLOBALS['SYSTEM_DATABASE_CONN']->sql_query($query); return true; }else{ return false; } } /** * removeFileFromOid:detruit les fichiers correspondant a l'objet de coordination * @param entier identifiant de l'objet * @access public * @return booleen */ function removeFileFromOid($oid) { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $row=array(); if (is_numeric($oid) && ($oid!=0) ) { $query ="DELETE FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."file WHERE oid=$oid"; $result=$GLOBALS['SYSTEM_DATABASE_CONN']->sql_query($query); $query ="DELETE FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."filedata WHERE oid=$oid"; $result=$GLOBALS['SYSTEM_DATABASE_CONN']->sql_query($query); return true; }else{ return false; } } /** * checkStruct:verifie que la structure de BD existe, sinon cet élément la crée * * @access public * @return tableau tableau des infos fichier (nom, id, size, type=>extention) */ function checkStruct() { $sql="SHOW TABLE STATUS"; $GLOBALS['SYSTEM_DATABASE_CONN']->sql_query($sql); } } /** * Classe UploadToDb * * Permet la gestion de Wyzis * @todo Les tests ne sont pas encore fait pour la gestion de fichier sur disque... * @package package * @subpackage file */ class UploadToDir extends Upload { /**#@+ * @access private */ /** * @var chaine * @desc chemin du repertoire de telechargement (fonctionnement fichier) */ var $uploadDir="./data/upload/"; /**#@-*/ /** *Constructeur de la classe UploadToDir * *

Initialise la classe

* * @param chaine nom du champ * @param chaine nom du repertoire */ function UploadToDir($fieldName="upload", $uploadDir=null) { $this->__construct($fieldName, $uploadDir); } /** *Constructeur de la classe UploadToDir * *

Initialise la classe

* le fichier est a inclure dans votre script avec l'instruction includePackage(upload.php) * @param chaine nom du champ * @param chaine nom du repertoire */ function __construct($fieldName="upload", $uploadDir=null) { parent::__construct($fieldName); $this->uploadDir=(!is_null($uploadDir))?$uploadDir:$GLOBALS["CONF_DATA_PATH"]."data/upload/"; } /** * uploadFile:retourne la clé du fichier enregistré... nom du fichier ou faux *enregistre le fichier uploade si existant dans le repertoire upload dir
* on notera que le nom du fichier est formaté et que 1 fichier ne peut pas être écraser
* * @access public * @param entier identifiant du noeud * @param entier identifiant de l'objet * @param entier identifiant de l'utilisateur * @param chaine mode de fonctionement false * @return retourne la clé du fichier enregistré... nom du fichier */ function uploadFile($nid, $oid, $uid, $mode="NODE", $chmod="") { $uid=($uid=="")?$GLOBALS["SYSTEM_USER_SESSION"]->user->getId():$uid; set_time_limit( CONF_UPLOAD_TIME ); $boolUploaded=false; /* Récupération de la valeur */ $erreur=0; if ($this->isValidPostFile()) { $tmp=$_FILES[$this->fieldName]["tmp_name"]; /* Vérification de la taille restante */ $uploadLimit=new UploadLimit($nid, $uid); if (filesize($tmp)<$uploadLimit->getFreeSpace($mode) || $mode==false || $mode=="NONE") { /* Initialisation du fileName de fichier */ $this->fileName = $this->validfileName(); /* jusqu'a ce que le fileName de fichier soit correct (par rapport au disque) */ do { /* Cas changement du fileName de fichier (si existant) */ if ($erreur==2) { $this->formatfileName(); } $erreur=$this->isUploadedFile(); }while ($erreur!=0 && $erreur!=1); /* fonction depuis Php4 qui test en mm temps si le fichier a été uploadé */ $boolUploaded = move_uploaded_file($_FILES[$this->fieldName]["tmp_name"] , $this->uploadDir.$this->fileName); if ($boolUploaded==true) { if ($chmod!="") chmod($this->uploadDir.$this->fileName, $chmod); if ($mode!="NONE") { $query="INSERT INTO ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."file (file_name, file_type, file_extention, file_size, file_location, nid, oid, uid, file_limit_owner)"; $query.="VALUES('".$this->uploadDir.$this->fichier."', '".$_FILES[$this->fieldName]["type"]."', '".$this->extentionFinder($this->fichier)."',"; $query.=filesize($_FILES[$this->fieldName]["tmp_name"]).", 'FILE', ".$nid.", ".$oid.", ".$uid.", ".$this->limitOwner.")"; // Execute Query $result = $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($query); $file_id = $GLOBALS["SYSTEM_DATABASE_CONN"]->sql_nextid(); } } } } return ($boolUploaded==true)?$this->fileName:false; } /** * getFileInfo:retourne un tableau des infos fichier (nom, id, size, type=>extention) * * @access public * @param entier identifiant du fichier * @param entier identifiant du noeud * @param entier identifiant de l'objet * @return tableau tableau des infos fichier (nom, id, size, type=>extention) */ function getFileInfo($id, $nid, $oid) { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $row=array(); if (is_numeric($id) && ($id!=0) ) { $query ="SELECT * from ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."file WHERE file_id=$id AND oid=$oid"; $result=$GLOBALS['SYSTEM_DATABASE_CONN']->sql_query($query); if($GLOBALS['SYSTEM_DATABASE_CONN']->sql_numrows()>0) { $row = $GLOBALS['SYSTEM_DATABASE_CONN']->sql_fetchrow(); } } return $row; } /** * getFileContent:retourne les données du fichier * pour l'affichage utiliser voir printHeaders * * @access public * @param entier identifiant du fichier * @param entier identifiant du noeud * @param entier identifiant de l'objet * @return data */ function getFileContent($id, $nid, $oid) { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $row=array(); if (is_numeric($id) && ($id!=0) ) { $query ="SELECT * from ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."file WHERE file_id=$id AND oid=$oid"; $result=$GLOBALS['SYSTEM_DATABASE_CONN']->sql_query($query); if($GLOBALS['SYSTEM_DATABASE_CONN']->sql_numrows()>0) { $row = $GLOBALS['SYSTEM_DATABASE_CONN']->sql_fetchrow(); if (file_exists($this->uploadDir.$row["name"])) { $file=new File($this->uploadDir.$row["name"], "r"); return $file->readAll(); }else{ return false; } } } return false; } /** * removeFile:detruit le fichier correspondant * pour l'affichage utiliser printHeaders * * @access public * @param entier identifiant du fichier * @param entier identifiant du noeud * @param entier identifiant de l'objet * @return booleen */ function removeFile($id, $nid, $oid) { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $row=array(); if (is_numeric($id) && ($id!=0) ) { $query ="SELECT * from ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."file WHERE file_id=$id AND oid=$oid"; $result=$GLOBALS['SYSTEM_DATABASE_CONN']->sql_query($query); if($GLOBALS['SYSTEM_DATABASE_CONN']->sql_numrows()>0) { $row = $GLOBALS['SYSTEM_DATABASE_CONN']->sql_fetchrow(); if (file_exists($this->uploadDir.$row["name"])) { $query ="DELETE FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."file where file_id='$id' AND oid=$oid"; $result=$GLOBALS['SYSTEM_DATABASE_CONN']->sql_query($query); $query ="DELETE FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."filedata where file_id='$id' AND oid=$oid"; $result=$GLOBALS['SYSTEM_DATABASE_CONN']->sql_query($query); delete($this->uploadDir.$row["name"]); return true; } } } return false; } /** * removeFileFromOid:detruit les fichiers correspondant a l'objet de coordination * @access public * @param entier identifiant de l'objet * @return booleen */ function removeFileFromOid($oid) { //$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ; $row=array(); if (is_numeric($oid) && ($oid!=0) ) { $query ="SELECT * from ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."file WHERE oid=$oid"; $result=$GLOBALS['SYSTEM_DATABASE_CONN']->sql_query($query); if($GLOBALS['SYSTEM_DATABASE_CONN']->sql_numrows()>0) { $row = $GLOBALS['SYSTEM_DATABASE_CONN']->sql_fetchrow(); if (file_exists($this->uploadDir.$row["name"])) { $query ="DELETE FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."file WHERE file_id='$id' AND oid=$oid"; $result=$GLOBALS['SYSTEM_DATABASE_CONN']->sql_query($query); $query ="DELETE FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."filedata WHERE file_id='$id' AND oid=$oid"; $result=$GLOBALS['SYSTEM_DATABASE_CONN']->sql_query($query); delete($this->uploadDir.$row["name"]); return true; } } } return false; } // verification de l'existance du fichier sur disque !!! // sert a ne pas dupliquer la clé sur le nom du fichier... on garde les anciens... function isUploadedFile() { $erreur = 0; $perms_dest = fileperms($this->uploadDir); if ($perms_dest!=false) { $perms_dest = $perms_dest & 07; /* Le répertoire doit être lisible, inscriptible et éxécutable*/ if (!(($perms_dest & 01) && ($perms_dest & 02) && ($perms_dest & 04))) { /* Le répertoire doit être lisible, inscriptible et éxécutable*/ return 1; } clearstatcache(); //echo $uploadDirImage.$this->fichier; if (file_exists($this->uploadDir.$this->fileName)==true) { return 2; } }else{ /* repertoire non lisible */ return 1; } return 0; } } /** * Converti un num (en octect) en valeur affichable */ function convertOctToPrint($num) { return round(($num/1024), 0); } /** * Converti une valeur affichable en un num (oct) */ function convertPrintToOct($num) { return round(($num*1024), 0); } ?>