inwebo
Messages postés380Date d'inscriptionlundi 12 novembre 2007StatutMembreDernière intervention23 octobre 2014
-
14 févr. 2010 à 21:49
inwebo
Messages postés380Date d'inscriptionlundi 12 novembre 2007StatutMembreDernière intervention23 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 β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 ?
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 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à ;)
inwebo
Messages postés380Date d'inscriptionlundi 12 novembre 2007StatutMembreDernière intervention23 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.