1521 lines
42 KiB
PHP
Executable File
1521 lines
42 KiB
PHP
Executable File
<?php
|
|
|
|
/**-----------------------------------------------
|
|
*
|
|
* Rooty, 2018 <rooty@rooty.me>
|
|
*
|
|
*
|
|
* 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 <www.rooty.me|rooty@rooty.me>
|
|
* @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<br/>
|
|
* 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; $i<count($tabNode); $i++)
|
|
{
|
|
$sql.=" OR file_nid=".$tabNode[$i];
|
|
}
|
|
}
|
|
$sql.=" ) ";
|
|
|
|
/* si c uniquement pour 1 utilisateur */
|
|
if ( $uid!=0 )
|
|
{
|
|
$sql.=" AND (file_uid=".$uid.") AND file_limit_owner=1";
|
|
}
|
|
|
|
/* gestion du resultat */
|
|
$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_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<br/>
|
|
*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<br/>
|
|
*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<br/>
|
|
*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<br/>
|
|
*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<br/>
|
|
*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<br/>
|
|
*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; $i<count($tabtmp); $i++)
|
|
{
|
|
$tabtoTest=array_merge($tree->getSonOfIdPereArray($tabtmp[$i]), $tabtoTest);
|
|
}
|
|
$tabtmp=$tabtoTest;
|
|
}
|
|
|
|
$tab=array_merge($tab, array($nid));
|
|
$opt="";
|
|
for ($i=0; $i<count($tab); $i++)
|
|
{
|
|
if ($i>0)
|
|
$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; $j<count($tabRow);$j++)
|
|
{
|
|
if($tabRow[$j]["node_space_nid"]==$nid)
|
|
{
|
|
$find=true;
|
|
return $tabRow[$j]["node_space"];
|
|
}
|
|
}
|
|
|
|
// Pour chaque fils du noeud courant
|
|
for($i=0;$i<count($tabSonOfNid);$i++)
|
|
{
|
|
$find=false;
|
|
|
|
// on recupere la valeur associée
|
|
for ($j=0; $j<count($tabRow);$j++)
|
|
{
|
|
if($tabRow[$j]["node_space_nid"]==$tabSonOfNid[$i])
|
|
{
|
|
$find=true;
|
|
$val+=$tabRow[$j]["node_space"];
|
|
break;
|
|
}
|
|
}
|
|
if(!$find)
|
|
$val+=$this->treeTabSizeForNid($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)<br/>
|
|
* - 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<br/>
|
|
* 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 ="<input type='hidden' name='MAX_FILE_SIZE' value='10000000000000'/>\n<input type='file' name='".$this->fieldName."' value=''/>";
|
|
$str.='<input type="hidden" name="'.$this->fieldName.'_id" value=""/>';
|
|
|
|
// On affiche le document
|
|
if ($docId!="" || $docId==0)
|
|
{
|
|
$tabInfo=$this->getFileInfo($docId);
|
|
|
|
if (count($tabInfo)>0)
|
|
{
|
|
$str ='<table class="tabledetail"><tr><td>';
|
|
// 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="<img src='".$dirImage.$nomIcone."'/>";
|
|
else
|
|
$img="<img src='".$dirImage."default.png'/>";
|
|
|
|
$str.=$img."";
|
|
// Fin récupération du picto
|
|
|
|
$str.='</td><td><a href="'.$urlRead.'">'.$tabInfo["name"].'</a></td></tr>';
|
|
|
|
$str.="</table>";
|
|
$str.='<p><mx:text id="TxtFileDelete"/> :</p>';
|
|
$str.='<div class="boxcheck"><label><mx:text id="BtnYes"/></label>';
|
|
$str.='<input type="radio" name="'.$this->fieldName.'" value="1"/></div>';
|
|
$str.='<div class="boxcheck"><label><mx:text id="BtnNo"/></label>';
|
|
$str.='<input type="radio" name="'.$this->fieldName.'" value="0" checked/></div>';
|
|
$str.='<div><input type="hidden" name="'.$this->fieldName.'_id" value="'.$tabInfo["file_id"].'"/>';
|
|
$str.='</div>';
|
|
$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<br/>
|
|
* 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
|
|
*
|
|
*<p>Initialise la classe</p>
|
|
* @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
|
|
*
|
|
*<p>Initialise la classe</p>
|
|
* @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<br/>
|
|
*la table "prefixe systeme"files contient:<br/>
|
|
* - file_id : identifiant auto<br/>
|
|
* - name : nom du fichier<br/>
|
|
* - type : extention du fichier<br/>
|
|
* - size : taille du fichier<br/>
|
|
*<i>Cette table stocke les infos générales du fichier</i>
|
|
*la table "prefixe systeme"filedata contient:<br/>
|
|
* - id : identifiant auto<br/>
|
|
* - file_id : identifiant du fichier correspondant<br/>
|
|
* - type : extention du fichier<br/>
|
|
* - size : taille du fichier<br/>
|
|
*<i>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)
|
|
*</i>
|
|
* @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
|
|
*
|
|
*<p>Initialise la classe</p>
|
|
*
|
|
* @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
|
|
*
|
|
*<p>Initialise la classe</p>
|
|
* 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<br/>
|
|
* on notera que le nom du fichier est formaté et que 1 fichier ne peut pas être écraser<br/>
|
|
*
|
|
* @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);
|
|
}
|
|
?>
|