Upload

Résolu
inwebo Messages postés 380 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 23 octobre 2014 - 14 févr. 2010 à 21:49
inwebo Messages postés 380 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 23 octobre 2014 - 16 févr. 2010 à 18:24
Bonjour,

Voilà mon problème. Je viens de coder une class PHP5 d'upload (je sais je suis à la pointe de l'innovation moi), et j'ai un comportement étrange.

Tout d'abord le code php

<?php
/**
 * Upload d'un fichier à partir d'un formulaire HTML.
 *
 * Upload d'un fichier sur le serveur, possibilité de restreinde le mime-type grâce à un tableau
 * dans le fichier de destination $cible
 *
 *
 * @copyright  Inwebo
 * @license    http://creativecommons.org/licenses/by-nc-sa/2.0/fr/
 * @version    Février 2010
 * @link       
 * @since      Mai 2009
 */

class UpLoad {

/**
 * Envoi le fichier venant du champ input $inputFileFromForm dans le dossier $cible.Avec comme fichier
 * autorisés $allowedExt
 *
 * @arguments  STRING $inputFileFromForm : L'attribut name de la balise input  de votre formulaire 
 * 			   STRING $cible 			 : Dossier de destination, defaut 'temp/'
 * 			   ARRAY  $allowedExt		 : Tableau avec le(s) mime tympe autorisé(s), defaut archive zip
 * 
 * @return     VOID
 */
public function __construct($inputFileFromForm, $cible "temp/", $allowedExt array('application/zip',
  'application/x-zip-compressed')) {
$this->file 		= $inputFileFromForm;
$this->cible 		= $cible;
$this->allowedExt	= $allowedExt;

// Contient le compte rendu des operations
static $DUMP 		= array();
UpLoad::getErrors();
UpLoad::setUpload();
}

/**
 * Retourne les différents types d'erreurs, dans le tableau $_FILES
 *
 * @arguments 	VOID
 *
 * @return     	VOID
 */
private function getErrors() {
// Test si la cible est une chaine de caractère
if( !is_string( $this->cible ) ) {
$_FILES[$this->file]["error"] = 9;
}
// Test si les mimes types autorisés de le tableau $allowedExt
if( !is_array( $this->allowedExt )) {
$_FILES[$this->file]["error"] = 10;
}
// Test si le repertoire $cible existe
if( !file_exists( $this->cible ) ) {
$_FILES[$this->file]["error"] = 11;
}
// Test si le format de fichier est valide
if( UpLoad::getExtAllowed() == 0 ) {
$_FILES[$this->file]["error"] = 12;
}
}

/**
 * Test si le mime-type est autorisé
 * 
 * @arguments  VOID
 * 
 * @return     BOOL 1 si autorisé, sinon 0
 */
private function getExtAllowed() {
$r =  0;
$j = -1;
while( isset( $this->allowedExt[++$j] ) ) {
if( $_FILES[$this->file]["type"] == $this->allowedExt[$j] ) {
++$r ;
}
else {
NULL;
}
}
return $r;
}

/**
 * Renvoi le statut de l'upload.
 * 
 * @arguments  VOID
 * 
 * @return     ARRAY $DUMP
 */
private function setDump() {
switch( $_FILES[$this->file]["error"] ) {
// Upload reussis
case 0:
$DUMP[0]			 = 1;
$DUMP[1]			 = "Upoad terminé.";
$DUMP['dossier']	 = $this->cible;
$DUMP['fichier'] 	 = $_FILES[$this->file]["name"];
$DUMP['type'] 	 	 = $_FILES[$this->file]["type"];
$DUMP['size']	 	 = $_FILES[$this->file]["size"];
$DUMP['temp file']	 = $_FILES[$this->file]["tmp_name"];
break;

// Erreurs
case 1:
$DUMP[0] = 0;
$DUMP[1] = "Le fichier excéde la taille de upload_max_filesize, du php.ini.";
break;

case 2:
$DUMP[0] = 0;
$DUMP[1] = "Le fichier excéde la taille de MAX_FILE_SIZE, du formulaire HTML.";
break;

case 3:
$DUMP[0] = 0;
$DUMP[1] = "Le fichier n'a été que partiellement téléchargé.";
break;

case 4:
$DUMP[0] = 0;
$DUMP[1] = "Aucun fichier n'a été téléchargé.";
break;

case 6:
$DUMP[0] = 0;
$DUMP[1] = "Le dossier temporaire est manquant.";
break;	

case 7:
$DUMP[0] = 0;
$DUMP[1] = "Echec de l'écriture du fichier sur le disque.";
break;	

case 8:
$DUMP[0] = 0;
$DUMP[1] = "L'envoi de fichier est arrâté par l'extension.";
break;

case 9:
$DUMP[0] = 0;
$DUMP[1] = "L'argument \$cible n'est pas une chaine de caractère.";
break;

case 10:
$DUMP[0] = 0;
$DUMP[1] = "L'argument \$allowedExt n'est pas un tableau.";
break;

case 11:
$DUMP[0] = 0;
$DUMP[1] = "Le dossier de destination n'existe pas.";
break;

case 12:
$DUMP[0] = 0;
$DUMP[1] = "Format de fichier non valide.";
break;

}
return $DUMP;
}

/**
 * Copie du fichier temporaire jusqu'au dossier cible
 * 
 * @arguments  VOID
 * 
 * @return     NULL si erreur, sinon 1
 */
private function setUpload() {
if( $_FILES[$this->file]["error"] > 0 ) {
NULL;
}
else {
move_uploaded_file( $_FILES[$this->file]["tmp_name"], $this->cible . $_FILES[$this->file]["name"] );
}
 }

/**
 * Renvoi le debug
 * 
 * @arguments  VOID
 * 
 * @return     ARRAY
 */
public function getDump() {
return UpLoad::setDump();
}

/**
 * Retourne la valeur en bytes de la variable post_max_size du
 * php.ini
 *
 * cf : http://php.net/manual/fr/function.ini-get.php
 * 
 * @arguments  $val fichier upload
 * 
 * @return     INT taille de fichier maximal en octet
 */
static public function return_bytes() {
$val = trim( ini_get('upload_max_filesize') );
    $last = strtolower( $val[strlen($val)-1] );
switch( $last ) {
// Le modifieur 'G' est disponible depuis PHP 5.1.0
case 'g':
$val *= 1024;
case 'm':
$val *= 1024;
case 'k':
$val *= 1024;
}
return $val;
}
}
?>


Mon formulaire

<?php
include_once('class/inc.upload.php5');

// Test si le formulaire est soumis.
(!isset($_REQUEST['soumis'])) ? $_REQUEST['soumis'] = 0 : null;
if($_REQUEST['soumis'] == 1) {
// Upload cf class/inc.upload.php5
$fichier = new UpLoad('fichier', 'temp/');
$dumpFichier = $fichier->getDump();
}
else {
$dumpFichier = "";
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Class upload</title>
<META NAME="Author" CONTENT="Inwebo">
<META NAME="Category" CONTENT="php, class, upload">
<META NAME="Description" CONTENT="Class php5 d'upload de fichier">
<META NAME="Keywords" CONTENT="php, class, upload">
<META NAME="Robots" CONTENT="all">
</head>



   Class upload fichier &beta;eta

<form action="" method="post" enctype="multipart/form-data" name="Options" target="_self" onsubmit="" >
<fieldset>
<legend>Fichier</legend>
<!-- NB : Notez l'astuce pour récuperer la taille maximale des fichiers à envoyée  -->
" />
 Taille max du fichier <?php print( UpLoad::return_bytes() ); ?> o
<hr />
<?php

if($_REQUEST['soumis'] == 1) {
print_r($dumpFichier[1]);
}
?>
<hr />
        
        
</fieldset>
</form>



</html>


Le script "fonctionne" (enfin non pas avec le comportement attendu), il me manque l'affichage de message d'erreurs, par exemple lorsque le fichier à uploader à un poids plus important que max_upload_file, ou que la taille maximum indiqué dans le formulaire HTML.

J'espère avoir été assez clair.Auriez-vous une idée ?

2 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
15 févr. 2010 à 05:03
Salut,

Je crois comprendre que tes messages d'erreurs sont stockés dans la variable $DUMP qui n'est accessible QUE dans le constructeur et qui n'EST PAS DEFINIE ailleurs... Il ne faut pas utiliser une variable statique, mais une propriété statique.
Illustration :
class UpLoad {
    static $DUMP = array();

    public function bidule() {
        return self::$DUMP;
    }
}


--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
3
inwebo Messages postés 380 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 23 octobre 2014
16 févr. 2010 à 18:24
Bonjour le lève tôt ou le couche tard,

Judicieuse remarque, j'avais déterré ce code et il avait un comportement étrange car il était codé étrangement, donc tout s'explique, par exemple j'ecrasais les variables du tableau $_FILES['error'] au fur et à mesure elles n'étaient donc pas accessible.

Merci
0
Rejoignez-nous