Example #1
0
 /**
  * Récupérer un fichier uploadé, effectuer les vérifications demandées, et l'enregistrer dans le dossier et sous le nom indiqué.
  * 
  * @param string   $fichier_final_chemin
  * @param string   $fichier_final_nom           (facultatif) Si pas transmis, ce sera le nom du fichier envoyé (nettoyé) ; si transmis, peut comporter ".<EXT>" qui sera remplacé par l'extension du fichier réceptionné.
  * @param array    $tab_extensions_autorisees   (facultatif) tableau des extensions autorisées
  * @param array    $tab_extensions_interdites   (facultatif) tableau des extensions interdites
  * @param int      $taille_maxi                 (facultatif) en Ko
  * @param string   $filename_in_zip             (facultatif) nom d'un fichier contenu dans le fichier zippé reçu, à extraire au passage
  * @return TRUE|string                          TRUE ou un message d'erreur
  */
 public static function recuperer_upload( $fichier_final_chemin , $fichier_final_nom=NULL , $tab_extensions_autorisees=NULL , $tab_extensions_interdites=NULL , $taille_maxi=NULL , $filename_in_zip=NULL )
 {
   // Si le fichier dépasse les capacités du serveur, il se peut que $_FILES ne soit même pas renseigné.
   if(!isset($_FILES['userfile']))
   {
     return 'Problème de transfert ! Fichier trop lourd ? '.InfoServeur::minimum_limitations_upload();
   }
   // Si $_FILES est renseigné, il se peut qu'il y ait quand même eu un dépassement des limites ou un problème d'écriture.
   $tab_file = $_FILES['userfile'];
   $fichier_tmp_nom    = $tab_file['name'];
   $fichier_tmp_chemin = $tab_file['tmp_name'];
   $fichier_tmp_taille = $tab_file['size']/1000; // Conversion octets => Ko
   $fichier_tmp_erreur = $tab_file['error'];
   if( (!file_exists($fichier_tmp_chemin)) || (!$fichier_tmp_taille) || ($fichier_tmp_erreur) )
   {
     $alerte_open_basedir = InfoServeur::is_open_basedir() ? ' Variable serveur "open_basedir" mal renseignée ?' : '' ;
     $alerte_upload_size = ' Fichier trop lourd ? '.InfoServeur::minimum_limitations_upload();
     return 'Problème de récupération !'.$alerte_open_basedir.$alerte_upload_size;
   }
   // Vérification d'une sécurité sur le nom
   if($fichier_tmp_nom{0}=='.')
   {
     return 'Le nom du fichier ne doit pas commencer par un point !';
   }
   // Vérification de l'extension
   $extension = strtolower(pathinfo($fichier_tmp_nom,PATHINFO_EXTENSION));
   if( ($tab_extensions_autorisees!==NULL) && (!in_array($extension,$tab_extensions_autorisees)) )
   {
     return 'L\'extension du fichier transmis n\'est pas conforme !';
   }
   if( ($tab_extensions_interdites!==NULL) && (in_array($extension,$tab_extensions_interdites)) )
   {
     return 'L\'extension du fichier transmis est interdite !';
   }
   // Vérification de la taille
   if( ($taille_maxi!==NULL) && ($fichier_tmp_taille>$taille_maxi) )
   {
     $conseil = '';
     if( ($tab_extensions_autorisees!==NULL) && (in_array('jpg',$tab_extensions_autorisees)) )
     {
       $conseil = (($extension=='jpg')||($extension=='jpeg')) ? ' : réduisez les dimensions de l\'image' : ' : convertissez l\'image au format JPEG' ;
     }
     return 'Le fichier dépasse les '.$taille_maxi.' Ko autorisés'.$conseil.' !';
   }
   // On rapatrie le fichier dans l'arborescence SACoche, en en dézippant un fichier précis si demandé
   $fichier_final_nom = ($fichier_final_nom) ? str_replace('.<EXT>','.'.$extension,$fichier_final_nom) : Clean::fichier($fichier_tmp_nom);
   if( ($extension!='zip') || ($filename_in_zip===NULL) )
   {
     if(!move_uploaded_file($fichier_tmp_chemin,$fichier_final_chemin.$fichier_final_nom))
     {
       return 'Le fichier n\'a pas pu être enregistré sur le serveur.';
     }
   }
   else
   {
     // Dézipper le fichier (on considère alors que c'est un zip venant de SACoche et contenant import_validations.xml)
     if(extension_loaded('zip')!==TRUE)
     {
       return 'Le serveur ne gère pas les fichiers ZIP ! Renvoyez votre fichier sans compression.';
     }
     // Remarque : la ligne suivante peut balancer un exit sans se poser de questions
     FileSystem::unzip_one( $fichier_tmp_chemin , $filename_in_zip , $fichier_final_chemin.$fichier_final_nom );
   }
   // C'est bon :)
   FileSystem::$file_upload_name = $fichier_tmp_nom;
   FileSystem::$file_saved_name  = $fichier_final_nom;
   return TRUE;
 }