Valider taille fichier avant upload

Fermé
secropia1313 Messages postés 16 Date d'inscription samedi 2 juin 2012 Statut Membre Dernière intervention 5 octobre 2018 - 2 nov. 2012 à 19:14
 maverick - 5 nov. 2012 à 20:13
Bonjour,

voici un beau petit code php comme je les aimes qui peut uploader un fichier, vérifier s'il n'est pas trop gros et ajouter un timestamp pour pas qu'il y est deux fichiers avec le même nom.

Le problème est que quand le fichier est trop gros il me renvois des erreurs sql du genre :
'' Notice: Undefined index: ... ''

Mais tout fonctionne. Ce n'est juste pas jolie jolie.

J'ai vraiment tout essayé, le code est simple pourtant et je n'arrive pas à voir ou est le problème.

Et en passant si vous avez une idée pour remplacé .txt par uniquement le point pour que peut importe le type de fichier un timestamp soit ajouté. ( j'ai enlevé txt et cela n'a pas fonctionné )

voici le code en question :

<?php 

$target = "images/recettes/"; 
$target = $target . basename( $_FILES['image_recette']['name']) ; 
$nom_final= preg_replace("'.txt'is",date("U").".txt",$target);
 
if(filesize($_FILES['image_recette']['tmp_name'])<101200)
{
move_uploaded_file($_FILES['image_recette']['tmp_name'], $nom_final);
			echo "The file ". basename( $_FILES['image_recette']['name']). " has been uploaded";
	}	
  else
 {
 echo "Sorry, there was a problem uploading your file."; 
 }
 
 ?> 

A voir également:

13 réponses

Le message d'erreur vient du fait que la variable serait vide ...! C'est normal que la variable soit vide on bloque le fichier s'il est trop gros. Je devrais trouvé un truc d'ici peut.
1
Bonsoir,

'' Notice: Undefined index: ... '' n'est pas un message d'erreur SQL mais PHP et pour afficher un message d'avertissement à l'utilisateur par rapport au poids du fichier téléchargé, il faut juste ajouter un else à ta condition qui teste le poids de ce fichier :
<?php

$target = "images/recettes/";
$target .= basename($_FILES['image_recette']['name']);
$nom_final = preg_replace("'.txt'is",date("U").".txt", $target);

if(filesize($_FILES['image_recette']['tmp_name'])<101200) {
	move_uploaded_file($_FILES['image_recette']['tmp_name'], $nom_final);
		echo "The file ". basename( $_FILES['image_recette']['name']). " has been uploaded";
	} else {
		echo "Sorry, there was a problem uploading your file.";
} else {
	echo "Sorry, your file exceeds the size limit of 101200Ko";
}
?>

ATTENTION lorsque que l'on manipule le téléchargement de fichiers aux directives contenues dans le fichier php.ini
Pour ce qui est de l'extension du fichier .txt je n'est pas trop compris ce que tu voulais faire sauf que je te recommande vivement de vérifier à l'aide d'une condition que le fichier est autorisé à être télécharger sinon tu risques de te retrouver face à une personne malhonnête qui pourrait utiliser cette faille pour télécharger sur ton serveur un programme malveillant.
0
<?php

$target = "images/recettes/";
$target .= basename($_FILES['image_recette']['name']);
$nom_final = preg_replace("'.txt'is",date("U").".txt", $target);

if(filesize($_FILES['image_recette']['tmp_name'])<101200) {
	if(move_uploaded_file($_FILES['image_recette']['tmp_name'], $nom_final)) {
		echo "The file ". basename( $_FILES['image_recette']['name']). " has been uploaded";
	} else {
		echo "Sorry, there was a problem uploading your file.";
	}
} else {
	echo "Sorry, your file exceeds the size limit of 101200Ko";
}
?>
0
Merci du conseil je vais assurément l'appliqué.

Par contre, pour le code il ne fonctionne pas dans sa forme actuel. Le message d'erreur à changer maintenant, on a un simple '' Parse error: syntax error, unexpected 'else' (T_ELSE) in ''

D'habitude je règle ces problèmes mais l'à je suis un peu perdu. Déjà qu'il y a deux else pour un if. Je vais revoir mes bases.

À tu une idée pourquoi j'ai une erreur de else.

Pour le txt...C'est que dans le code actuel un '' timestamp '' est ajouté avant l'extension .txt. Mais moi j'aimerais que ce '' timestamp ''( qui n'en est pas vraiment un ) s'applique à tout les genres de fichier.

Merci
0
Nhay Messages postés 838 Date d'inscription vendredi 2 novembre 2012 Statut Membre Dernière intervention 17 décembre 2015 126
3 nov. 2012 à 12:57
Vérifie que tu n'a pas mal copier, je ne vois pas d'erreur pour ma part, et il n'y as pas deux else pour un if, il y as deux if distinct, chacun ayant sont else, tu as peut-être zappé une accolade pour le coup.
0
Oui un if viens de ce rajouter, donc, j'ai recopié le code et cela fonctionnais presque. J'ai remplacé le plus petit que.. pour un plus grand que... Donc, un > à la place du <.

Ce que j'ai de la misère à comprendre c'est que quand le fichier est petit il n'y a aucun problème mais quand le fichier est volumineux le message "Sorry, your file exceeds the size limit of 101200Ko" s'affiche, jusque l'à super, mais il affiche aussi deux erreurs du genre '' Notice: Undefined index: image_recette in... ''. J'ai bien essayé de corriger mais je trouve très bizarre que j'ai un code d'erreur pour une situation et pas pour l'autre..C'est '' impossible ''. car c'est le même serveur même bout de code...

je continue mes recherche mais présentement je suis dans une impasse.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
J'ai parlé trop vite pour les signes <> cela cause des problèmes du coté des petits fichiers !!. Le code ne fonctionnais pas à cause du if qui a maintenant été ajouté et maintenant il ne fonctionne pas parce que ce n'est pas le bon message qui s'affiche.

Quand j'ai un fichier trop gros il affiche le message '' Sorry, there was a problem uploading your file. '' au lieu de l'autre. J'ai tout simplement inversé les messages et maintenant tout fonctionne comme prévue mais je ne sait pas si c'est propre.

Je reviens avec un code complet comprenant la suggestion plus que pertinent de ReDLoG pour les .exe.

p.s. pour le message d'erreur je vais ajouter un '' error_reporting(E_ALL & ~E_NOTICE); '' qui me semble correct dans cette situation. Pour le développement par contre je vais laisser les messages d'erreurs apparaitre.

Ma seul préoccupation est de ne pas savoir si error_reporting effectue des changements réelles dans le php.ini de façon permanente.

Merci
0
Nhay Messages postés 838 Date d'inscription vendredi 2 novembre 2012 Statut Membre Dernière intervention 17 décembre 2015 126
3 nov. 2012 à 16:18
error_reporting ne fonctionne que pendant la durée d'exécution du script, il ne change donc pas le fichier php.ini
0
Bon voici le code final. ( Merci à vous deux pour votre contribution )

Le formulaire d'upload suivant permet au client de choisir son fichier à uploader :

 <form enctype="multipart/form-data" action="t_up.php" method="POST">
    
   <p>
            <label for="image">
            Photo de la recette
          </label>
          <br />
          <input type="file" id="image" name="image_recette" />
          </p>

        <p>
      <input type="submit" name="valider" value="Envoyez" />
    </p> 
    
     </form> 


Et voici le code qui va traiter le fichier. Il va :

. enlever les espaces,
. ajouter un timestamp avant le nom du fichier,
pour s'assurer qu'il n'y ai pas deux fichiers identiques,
. vérifier qu'il ne dépasse pas un certain poids,
. un '' error_reporting(E_ALL & ~E_NOTICE); '' pour que le message d'erreur au sujet d'un fichier inexistent ne s'affiche pas quand le fichier est trop volumineux.
( je suggère de l'enlever pendant votre développement )
. Placer le fichier dans le dossier approprié.

N.B. Je n'ai pas inclue un contrôle de fichier malveillant pour l'instant. Cela sera absolument nécessaire. Et je penserai à repasser pour mettre à jour le code quand il sera fait.

<?php
error_reporting(E_ALL & ~E_NOTICE);

$time = time();
$tmp= basename($_FILES['image_recette']['name']);
$target = "images/recettes/";
$target .= $time.$tmp;
$nom_final = preg_replace ("' 'i","",$target);

if(filesize($_FILES['image_recette']['tmp_name'])<101200) {
	if(move_uploaded_file($_FILES['image_recette']['tmp_name'], $nom_final)) 
	{
		echo "Le fichier ". basename( $_FILES['image_recette']['name'])." a bien été transferé";
	} else {
		echo "Désolé le fichier excède la limite permise";
	}
} else {
	echo "Désolé, il y eu un problème lors du transfert";
}
?>


Voilà, le code est fonctionnel mais surement pas parfait, si quelqu'un veut l'améliorer je le testerai pour confirmer.

Merci
0
Bonjour,

j'ai ajouté une vérification de l'extension pour ne pas qu'un pirate upload un fichier php. Par contre, par la suite je n'arrive pas à faire afficher le message "Désolé le fichier excède la limite permise". Pourtant je vérifié l'ordre des if et else plusieurs fois et tout me semble correct.

Est-ce que vous avez une idée.

Voici le code :

 <?php

$tabExt = array('jpg','gif','png','jpeg'); // Extensions autorisees
$infosImg = array();
 
$extension = '';

error_reporting(E_ALL & ~E_NOTICE);
$time = time();
$tmp= basename($_FILES['image_recette']['name']);
$target = "images/recettes/";
$target .= $time.$tmp;
$nom_final = preg_replace ("' 'i","",$target);

if(filesize($_FILES['image_recette']['tmp_name'])<101200) 
{
 // Recuperation de l'extension du fichier
$extension = pathinfo($_FILES['image_recette']['name'], PATHINFO_EXTENSION);
 
// On verifie l'extension du fichier
if(in_array(strtolower($extension),$tabExt))
{
	if(move_uploaded_file($_FILES['image_recette']['tmp_name'], $nom_final)) 
	{
		echo "Le fichier ". basename( $_FILES['image_recette']['name'])." a bien été transferé";
		
	} else {
		echo "Désolé, il y eu un problème lors du transfert";
	}
} else {
	echo "Désolé, ce fichié n'est pas une image ";
}
}  else {
	echo "Désolé le fichier excède la limite permise";
}
0
Nhay Messages postés 838 Date d'inscription vendredi 2 novembre 2012 Statut Membre Dernière intervention 17 décembre 2015 126
5 nov. 2012 à 17:54
if(filesize($_FILES['image_recette']['tmp_name'])<101200)

Fonctionnerait peut-être mieux comme ça :
if(filesize($_FILES['image_recette']['size'])<101200)
0
Nhay Messages postés 838 Date d'inscription vendredi 2 novembre 2012 Statut Membre Dernière intervention 17 décembre 2015 126
5 nov. 2012 à 19:54
Je suis pas bien réveiller, j'ai en effet dit n'importe quoi
0
Cale ne fonctionne pas. Je suis revenue à tmp_name et tout fonctionne.

Mon problème actuel est que ce ne sont pas les bon messages qui apparaissent en fonction des situations. J'ai bien sûr tout chamboulé pour trouvé une solution. Sans résultat.

Quelqu'un à une idée.
0
le problème est vraiment quand le fichier est trop gros...Il bloque parfaitement le transfert mais la condition si rattachant qui affiche le message approprié ne s'exécute pas. Il prend le else suivant..

J'ai même supprimé un else qui me semblais inutile et rien ne change...

;(
0
Nhay Messages postés 838 Date d'inscription vendredi 2 novembre 2012 Statut Membre Dernière intervention 17 décembre 2015 126
5 nov. 2012 à 19:57
Dans ton code, je ne vois pas d'erreur dans la structure conditionnelle en tout cas, les if/else sont bien 'raccordé', as-tu essayer un petit echo sur filesize($_FILES['image_recette']['tmp_name']) histoire de voir ce qu'il te retourne ?
0
Bonne idée, je l'ai fait et j'obtiens tout simplement la taille du fichier. Et dès que le fichier ( jpg) est trop gros il affiche tout le temps le message au sujet des extension d'image.


Si les if / else sont bien raccordé ( et je te crois ) je ne voie pas comment une image trop grosse peut afficher le mauvais message.
0