Page 1 sur 1

PRoblème Upload

Posté : 08 févr. 2011, 20:23
par diabless6
Bonsoir,

J'aimerai savoir ce que j'ai oublier dans mon code, il est pas au complet, mais bon je suis a mon énième listing, j'adore simplifié les choses 8-| .
Normalement, j'ai une logique à tout épreuve, mais ya un truc qui m'échappe.

J'ai initialisé mes valeurs de mon php.ini et je n'y toucherait plus car j'estime que ça devrait aller pour mon projet :

php_value post_max_size 8M // valeur par défaut.( On va faire comme si je ne pouvais pas la modifier )
php_value upload_max_filesize 2M // taille maximum d'un fichier à uploader.

Le HTML en rapport :
<form action="<?php $_SERVER['PHP_SELF'] ?>" method="post" enctype="multipart/form-data" name="myform">
          <input type="file" name="fichier[]"/><br>
          <input type="file" name="fichier[]"/>
          <input type="hidden" name="MAX_FILE_SIZE[]" value="2000000"/>
          <input type="submit" name="submit" value="ok"/>
          <input type="reset" name="reset" value="zero"/>
      </form>
Juste que je suis pas certaine de MAX_FILE_SIZE[] , mais elle est nécessaire car le PHP l'utilise dans sa vérification:
case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form
$reponse='Le fichier que vous essayez de télécharger est trop gros.';
//fonction réorganisation du Array

function reArrayFiles(&$file_post) {
    $file_ary = array();
    $file_count = count($file_post['name']);
    $file_keys = array_keys($file_post);
    for ($i=0; $i<$file_count; $i++) {
    foreach ($file_keys as $key) {
            $file_ary[$i][$key] = $file_post[$key][$i];
                                              }
                                                   }
    return $file_ary;
}

Fonction qui rend plus lisible le tableau $_files d'origine.

Je le récupère ici :
 $files=reArrayFiles($_FILES['fichier']);
$user['n1']=$files;
$user['n2']=$files;
ça c'est juste quand je rajouterai des utilisateurs avec les sessions pas implémentées pour l'instant.
for($i=0;$i<count($files);$i++){
		
if( is_uploaded_file($files[$i]['error']) )
{ 
	$reponse=' Envoye module de copie Fichier ';
}
else{
$erreur=$files[$i]['error'];
switch("$erreur"){
    case 0: //no error; possible file attack!
      $reponse='Il y a un problème avec le téléchargement !';
      break;
    case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini
      $reponse='Le fichier est trop gros pour le php !';
      break;
    case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form
      $reponse='Le fichier est plus gros que la taille spécifiée dans le HTML !';
      break;
    case 3: //uploaded file was only partially uploaded
      $reponse='Le fichier est partiellement téléchargé !';
      break;
    case 4: //no file was uploaded
      $reponse='Vous devez sélectionner un fichier à télécharger !';
      break;
    default: //a default error, just in case!  :)
      $reponse='Il y a un problème avec le téléchargement !.';
      break;	
				}
			
	}
	
echo $reponse.'<br>';
}

Essais ici : http://blogme.homeip.net/Projets%20pers ... load/e.php

Un ça va, mais 2.... :mrgreen:

Merci

Re: PRoblème Upload

Posté : 08 févr. 2011, 21:47
par diabless6
En faites max_file_uploads = 20 par defaut upload les 2 fichiers simultanément.

Mon script ne peut pas fonctionner sur un serveur mutualisé de cette façon.

Il faudrait que mes fichiers soient envoyés 1 par 1 et pas simultanément.
En PHP c'est pas possible me semble-til ?
Donc l'ajax de façon asynchrone :roll:

Re: PRoblème Upload

Posté : 08 févr. 2011, 22:32
par AB
MAX_FILE_SIZE s'écrit sans '[]' et vaut pour toutes les lignes de champ de type file qui suivent. MAX_FILE_SIZE doit donc être placé avant les champs de type file.

Il n'y a pas de problème à charger plus fichiers simultanément si le total est inférieur à post_max_size.

On peut gérer l'erreur et afficher un message adéquat en cas de ce dépassement pour éviter l'affichage d'une page vide (ce que tu n'a pas prévu dans ton code).

Y'a un tuto sur le téléchargement de fichiers ici

C'est une petite partie.

Pour plus complet et surtout plus facilement réutilisable il faut voir par exemple cette classe de téléchargement qui permet l'upload multiple, le redimensionnement multiple des images, le nommage des fichiers, le renommage (si un fichier de même nom se trouve déjà sur le serveur), la gestion des erreurs (y compris le dépassement du post_max_size ou du memory_limit en cas de redimensionnement) etc. Et avec une configuration html minimaliste.
Regardes donc plutôt si cette classe ne fait pas déjà ce que tu veux faire (et demande en cas de besoin) car si c'est pour refaire quelque chose d'approchant ça va te faire beaucoup de travail assez ingrat et peu instructif dans le sens où c'est très spécifique. Sinon tu peux aussi t'inspirer du code.

Re: PRoblème Upload

Posté : 09 févr. 2011, 00:21
par diabless6
Ben je voudrais pas réinventer le roue, c'est sûr. Faudrait que je fasse des essaies et rajouter de l'ajax si possible.

Re: PRoblème Upload

Posté : 09 févr. 2011, 01:27
par AB
L'ajax va pas te servir dans le cas d'upload.

On peut améliorer l'interface html assez facilement avec quelques lignes en javascript pour ajouter des champs de téléchargement à la volée.
La classe va gérer cela de façon transparente (rien à modifier dans le code ou le paramétrage php) puisque l'on peut écrire le champ html avec la notation tableau de type "userfil[]", même pour un seul champ. Donc pour ajouter des champs de téléchargement à la volée, il te suffit de rajouter dans le DOM des champs avec la même notation à l'aide de javascript.

Sinon le problème d'une solution php est qu'on est limité par la configuration serveur, mais même sur des mutualisés on peut rencontrer maintenant des config supérieures à 8 Mo par fichier donc cela commence à être pas mal. Sinon se tourner vers des serveurs dédiés qu'on peut configurer à souhait.

Après reste les solutions à base de flash, mais flash n'est pas implémenté partout, ni sur tous les mobiles (car demande trop de ressources) ni même sur tous les navigateurs par défaut. Donc pour être universel mieux vaut une solution côté serveur.

Il y a aussi des solutions javascript mais uniquement possibles sur certains navigateurs très récents (pas ie) et donc impossible de s'en servir pour un usage courant (à moins de limiter drastiquement le nombre de visiteurs qui pourront s'en servir).

Re: PRoblème Upload

Posté : 09 févr. 2011, 12:34
par diabless6
Je lisais la partie qui concerne mon problème que j'avais notifié :
Si le fichier téléchargé a une taille supérieure à "upload_max_filesize" mais inférieure ou égale à "post_max_size" on peut récupérer le message d'erreur correspondant dans l'index "error" du tableau $_FILES vu plus haut.
Par contre :
Si un, ou l'ensemble des fichiers téléchargés dépasse la valeur "post_max_size" les tableaux $_POST et $_FILES seront vides.
Pour récupérer le message d'erreur correspondant on envoie donc une variable $_GET qui nous servira de test, en même temps que le formulaire (dans l'attribut "action" de la balise "form"). Si cette variable $_GET existe mais que la variable $_POST témoin d'envoi du formulaire n'existe pas, on est dans ce cas de figure.
J'ai l'impression de ne pas saisir, il faut créer 2 forms, une GET et une POST, mais un bouton envoi ? #-o

Re: PRoblème Upload

Posté : 09 févr. 2011, 17:35
par AB
Tu as l'exemple complet codé. Tu vois 2 formulaires ?
Pour récupérer le message d'erreur correspondant on envoie donc une variable $_GET qui nous servira de test, en même temps que le formulaire (dans l'attribut "action" de la balise "form").

Re: PRoblème Upload

Posté : 09 févr. 2011, 18:51
par diabless6
Ben ça doit être ça :
action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?get_formulaire_1=1'?>"

Re: PRoblème Upload

Posté : 09 févr. 2011, 18:55
par AB
Ben oui.

Donc quand tu soumet ton formulaire tu as les données $_POST et $_FILES qui sont envoyées et aussi $_GET['get_formulaire_1']

Re: PRoblème Upload

Posté : 09 févr. 2011, 19:16
par AB
Ah oui je viens de comprendre que tu regarde à la fois le tuto et la classe...

Donc effectivement dans le premier exemple d'utilisation de la classe on a un formulaire avec

Code : Tout sélectionner

action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?get_formulaire_1=1'?>"
...

Code : Tout sélectionner

<!-- input d'identification du formulaire qui doit être passé en paramètre dans l'initialisation de la classe--> <input type = "hidden" name = "formulaire_1" value = "1" />
...

Code : Tout sélectionner

<input name = "photo[]" type = "file" size = "70" />
Et donc il suffit de déclarer la classe de téléchargement avec

Code : Tout sélectionner

$form_1 = new Telechargement ('PHOTO','formulaire_1','photo','get_formulaire_1');
PHOTO : étant le répertoire de destination
formulaire_1 : input de type $_POST témoin d'envoi du formulaire
photo : le nom du fichier de type file concerné
get_formulaire_1 : variable de type $_GET témoin d'envoi du formulaire

Voilà c'est aussi simple que cela.

D'ailleurs 'est ce que je dis dans le mode d'emploi de la classe
A/ INITIALISATION DE LA CLASSE

L'initialisation de la classe "Telechargement" requière trois paramètres indispensables, les quatrième et cinquième étant facultatifs

1/ le nom du répertoire de destination par rapport à la racine du site.

2/ Nom de l'input d'identification et de contrôle d'envoi du formulaire (ex : input de type hidden).

3/ Nom de l'input de type file de votre formulaire. Ce nom peut désigner un tableau pour l'envoi simultané de plusieurs fichiers.

4/ Nom de la variable $_GET de contrôle d'envoi du formulaire (variable $_GET dans l'attribut "action" de la balise "form").

5/ Tableau de messages pour personnaliser ou traduire les messages d'informations de résultat.

$var = new Telechargement('répertoire','input_hidden','userfile','get_action_form',$tab_infos);


Notes :

- Le répertoire de destination doit être indiqué par rapport à la racine www. Si vous testez en local avec plusieurs sites installés sur la racine du serveur d'évaluation (dans le répertoire www) vous devrez indiquer pour un chemin de répertoire valide :

nom_du_repertoire_du_site/nom_du_repertoire_du_dossier

et pour un fonctionnement sur le serveur distant, simplement :
nom_du_repertoire_du_dossier

L'avantage de cette configuration est que vous pouvez appeler ce script depuis n'importe quel endroit de votre site sans avoir à modifier le chemin des répertoires de destination.


- Le paramètre n°2 identifie le formulaire. Par conséquent ce paramètre doit être différent pour chaque formulaire si vous avez plusieurs formulaires d'envoi de fichiers dans une même page.

- Si le quatrième paramètre n'est pas renseigné ou erroné il n'y aura pas de message pour indiquer un éventuel dépassement de la taille maximum du $_POST autorisée par le serveur. Il est donc recommandé de le renseigner pour une gestion complète des erreurs.
C'est pas assez explicite ? Tu dirais comment ? N'hésite pas à me faire des suggestions, je modifierai si ça peut être plus clair.

Re: PRoblème Upload

Posté : 09 févr. 2011, 19:41
par diabless6
Sisi, j'ai tout saisie, mais j'essaie de comprendre ce que je pige pas, il m'arrive d'être c... parfois et quand ça vient pas, ça vient pas :mrgreen:

Je pense que c'est ça qui permet de tester :roll: :
get_formulaire_1=1'
private function Verif_max_post()
{                                                  
        if (isset($_GET[$this->verif_get]) && empty($_POST[$this->verif_post]))
                {
                        if (!empty($this->tab_mes[0])) $this->Set_message ('', '', $this->tab_mes[0]);
                       
                        $this->Get_Reload_page ();                      
                }
J'ai réalisé un essai pour comprendre avec 2 fichiers de 6mo et comme ils dépassent la limite, mon tableau $_post est vide.
Mais pour le test de $_GEt, je ne vois pas à quoi sa sert de tester son existence car elle existera d'une façon ou d'une autre 8-|

Re: PRoblème Upload

Posté : 09 févr. 2011, 20:33
par AB
Ben en cas de dépassement du post_max_size, si tu as fait afficher le tableau des messages d'information, la classe doit t'afficher le message : "Le poids total maximum du formulaire autorisé par le serveur est dépassé".
Elle sert à ça la variable $_GET passée dans la balise "action" du formulaire et indiquée dans la déclaration de la classe comme quatrième paramètre : elle existera quoi qu'il arrive si le formulaire est envoyé par contre sa soeur $_POST témoin d'envoi du formulaire n'existera pas si on dépasse le post_max_size. Et dans ce cas je renvoie le message d'erreur.

Re: PRoblème Upload

Posté : 09 févr. 2011, 20:50
par diabless6
Oui oui donc c'est bien ce que j'avais saisie :mrgreen:

Je vais de ce pas reprendre mon projet.

Merci beaucoup AB :wink: