Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/02/2008, 05h32   #1
Invité de passage
 
Inscription : mai 2004
Messages : 13
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 13
Points : 4
Points : 4
Par défaut [Upload] Traitement des données du formulaire upload

Bonjour,

J’ai un petit problème avec la fonction upload.

Ca coince au niveau de l’extension fichier qui me reviens systématiqement pas correcte, je comprend pas.

Qui peut m’aider ?

Merci, voici ce que j’ai fait.

Formulaire d’upload:
Code :
1
2
3
4
 
<form enctype = "multipart/form-data" action = "upload.php" method = "post" id = "formulimage" name = "formulimage">
Mon image <input type = "file" name = "monimage" id = "monimage" />
...
Reception des données :
Code :
1
2
3
4
5
 
<?php
include("redimension.php");
 
$fichier = upload("http//www.monsite.com/images/", "7000000000000", "monimage");
fichier fonction upload:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
<?php
 
	function upload($dossierStock, $taille, $inputName) {
		global $erreur;
		$champFile        = $inputName;
		$dossier          = $dossierStock; 
		$taille_maxi      = $taille; 
		$extensions       = array('.png', '.gif', '.jpg', '.jpeg', '.JPG', '.JPEG', '.PNG', '.BMP', '.bmp', '.GIF'); 
 
		if (isset($_FILES[$champFile])){
			$fichier = basename($_FILES[$champFile]['name']);
			$taille = filesize($_FILES[$champFile]['tmp_name']);
			$extension = strrchr($_FILES[$champFile]['name'], '.'); 
 
			//verif data
			if (!in_array($extension, $extensions)){
				$erreur = "extension fichier ".$fichier." pas correcte : ".$extension;
			}
 
			if ($taille > $taille_maxi){
				$erreur = "image trop grosse";
			}
sadao est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 11h45   #2
Membre actif
 
Homme
Développeur Web
Inscription : juillet 2007
Messages : 193
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2007
Messages : 193
Points : 189
Points : 189
Je n'ai pas trouvé l'erreur mais à votre place j'utiliserai getimagesize() qui renvoie le type mime de l'image. Cette donnnée est beaucoup plus sûr car en testant juste textuellement l'extension un utilisateur pourrait faire passer dans le script n'importe quel type de fichier renommé en .jpg par exemple.
metfan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 12h10   #3
Rédacteur/Modérateur
 
Avatar de _Mac_
 
Inscription : août 2005
Messages : 8 309
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 8 309
Points : 8 590
Points : 8 590
En ce qui concerne la sécurité, voir cette discussion : dans les références indiquées, il y en a une qui dit que getimagesize() peut être trompé. Personnellement, ce que j'ai fait et qui semble plutôt pas mal :
  1. Je fais un $file_info = pathinfo($_FILES["fichier"]["name"])
  2. J'examine la valeur de strtolower($file_info["extension"]) et je n'accepte que les valeurs "gif", "jpg" et "jpeg" par exemple.
  3. J'examine de nouveau strtolower($file_info["extension"]) : en fonction de la valeur renvoyée ("gif", "jpeg", "jpg"), je fais un $image = @imagecreatefromgif($_FILES["fichier"]["tmp_name"]) ou $image = @imagecreatefromjpeg($_FILES["fichier"]["tmp_name"])
  4. Je regarde $image : si c'est une image valide, c'est bon, sinon, message d'erreur

Pour revenir à ton pb, pour vérifier l'extension, je te suggère de faire comme moi :
Code :
1
2
3
4
$extensions       = array('png', 'gif', 'jpg', 'jpeg', 'bmp');
...
$file_info = pathinfo($_FILES[$champFile]['name']);
$extension = strtolower($file_info['extension']);
__________________

Du détail, du détail, du détail !!!
Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute
_Mac_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 17h23   #4
Invité de passage
 
Inscription : mai 2004
Messages : 13
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 13
Points : 4
Points : 4
Merci pour votre aide.

La solution de _Mac_ semble bien fonctionner.

Néanmoins, je n'arrive pas encore à l'uploader une image :la vérif extension est ok, la vérif taille fichier est ok, maintenant ca coince au niveau du fichier temporaire temp_name.

Vois pas bien ce qu'il faut faire avec temp_name

J'ai aussi fais un chmod sur le fichier de destination définitive

Merci encore pour votre aide.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
$fichier = pathinfo($_FILES[$champFile]['name']);
$taille = filesize($_FILES[$champFile]['tmp_name']);
$extension = strtolower($fichier['extension']);
 
//verif1
if (!in_array($extension, $extensions)){
				$erreur = "L'extension du fichier ".$fichier." n'est pas conforme : ".$extension;
			}
//verif2
if ($taille > $taille_maxi){
				$erreur = "Le fichier est trop gros";
			}
//verif3
if (!isset($erreur)) {
			$fichier = strtr($fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
			$fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
			$upload = move_uploaded_file($_FILES[$champFile]['tmp_name'], $dossier . $fichier);
 
if ($upload){
			chmod($dossier . $fichier, 0777);
				} else {
			$fichier = "Echec de l'upload !";
				}
				return $fichier;
			} else {
				echo $erreur;
			}	
		}
sadao est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 17h43   #5
Rédacteur/Modérateur
 
Avatar de _Mac_
 
Inscription : août 2005
Messages : 8 309
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 8 309
Points : 8 590
Points : 8 590
Citation:
Envoyé par sadao Voir le message
maintenant ca coince au niveau du fichier temporaire temp_name.
Ca veut dire quoi exactement ? Quel est le pb exact rencontré ? Il passe dans ton if ? Est-ce que $dossier a bien la bonne valeur ? Est-ce que le répertoire existe bien et que l'utilisateur Apache/PHP peut écrire dedans ?
__________________

Du détail, du détail, du détail !!!
Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute
_Mac_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 18h54   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Je rappelle que le protocole HTTP (pour PHP du moins), n'est pas utilisable en écriture ! Votre chemin de destination (http//www.monsite.com/images/) est donc incorrect et la fonction move_uploaded_file doit d'ailleurs générer un message d'erreur à ce sujet.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 20h54   #7
Invité de passage
 
Inscription : mai 2004
Messages : 13
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 13
Points : 4
Points : 4
@ julp, Merci c'était bien ca.

Encore un ptit blème quand même. Que j'essaye ca OU ca, j'uploalde ARRAY... Pourquoi ?

Merci

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
$extensions       = array('.png', '.gif', '.jpg', '.jpeg', '.JPG', '.JPEG', '.PNG', '.BMP', '.bmp', '.GIF');
...
 
$extension = strrchr($_FILES[$champFile]['type']);
 
OU
 
$extensions       = array('png', 'gif', 'jpg', 'jpeg', 'bmp');
...
 
$extension = strtolower($fichier['extension']);
sadao est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 23h40   #8
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Parce que la variable $fichier est maintenant un tableau :
Code :
$fichier = pathinfo($_FILES[$champFile]['name']);
Alors qu'initialement c'était une chaîne et que votre code n'a pas été entièrement adapté :
Code :
$fichier = basename($_FILES[$champFile]['name']);
(au niveau du message d'erreur, de l'appel à la fonction move_uploaded_file ou encore chmod notamment)


Vous auriez pu être plus direct :
Code :
$extension = strtolower(pathinfo($_FILES[$champFile]['name'], PATHINFO_EXTENSION));
Pour éviter de passer par une variable intermédiaire et entraîner toutes ces complications.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 05h43   #9
Invité de passage
 
Inscription : mai 2004
Messages : 13
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 13
Points : 4
Points : 4
@ Julp Ok Merci.

Mais qu'est qui n'est pas bon dans l'appel move_uploaded_file et chmond si j'appelle un tableau au lieu d'une chaine

J'ai indiqué le filename et la destination : ( string $filename , string $dossier )
et le chmod, normalement c'est bien ce qu'il faut faire...

J'ai cherhcé dans la doc Php mais J'vois pas ce qui faut faire
sadao est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 10h32   #10
Rédacteur/Modérateur
 
Avatar de _Mac_
 
Inscription : août 2005
Messages : 8 309
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 8 309
Points : 8 590
Points : 8 590
J'ai rien compris

Dans un move_uploaded_file, la cible, c'est pas que le dossier, c'est le dossier + le nom du fichier définitif.
__________________

Du détail, du détail, du détail !!!
Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute
_Mac_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 12h05   #11
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par sadao
Mais qu'est qui n'est pas bon dans l'appel move_uploaded_file et chmond si j'appelle un tableau au lieu d'une chaine
Le type approprié pour indiquer un chemin vers un fichier est une chaîne. Prenez pour référence l'extrait de la documentation que vous citez : ces fonctions attendent des string comme paramètres. Pourquoi ça ne fonctionne pas avec un tableau ? Tout simplement parce que PHP ne saura pas effectuer cette conversion tableau vers chaîne de caractères, c'est trop complexe (faudrait-il notamment prendre les clés et les valeurs, uniquement les valeurs lors d'une interpolation ?). C'est ainsi, que vous obtenez "Array" lorsque vous tentez tout de même de le faire. Tout ceci sans tenir compte du fait qu'en plus, votre "tableau" (la variable $fichier), n'indique pas vraiment, comme l'a souligné _Mac_, le chemin vers le fichier.

Pour corriger, je vous ai donné une solution pour conserver votre code "initial". Sinon vous devrez renommer vos variables ou modifier les lignes que j'ai indiqué.

Solution 1, à partir du code initial :
Code :
1
2
3
$extensions       = array('.png', '.gif', '.jpg', '.jpeg', '.JPG', '.JPEG', '.PNG', '.BMP', '.bmp', '.GIF');
 
$extension = strrchr($_FILES[$champFile]['name'], '.');
A remplacer par :
Code :
1
2
3
$extensions       = array('png', 'gif', 'jpg', 'jpeg', 'bmp');
 
$extension = strtolower(pathinfo($_FILES[$champFile]['name'], PATHINFO_EXTENSION));
Solution 2, à partir du code actuel :
Code :
1
2
3
4
5
6
7
$erreur = "L'extension du fichier ".$fichier." n'est pas conforme : ".$extension;
 
$upload = move_uploaded_file($_FILES[$champFile]['tmp_name'], $dossier . $fichier);
 
chmod($dossier . $fichier, 0777);
 
return $fichier;
Deviennent, par exemple :
Code :
1
2
3
4
5
6
7
$erreur = "L'extension du fichier ".basename($_FILES[$champFile]['name'])." n'est pas conforme : ".$extension;
 
$upload = move_uploaded_file($_FILES[$champFile]['tmp_name'], $dossier . basename($_FILES[$champFile]['name']));
 
chmod($dossier . basename($_FILES[$champFile]['name']), 0777);
 
return basename($_FILES[$champFile]['name']);
(je n'ai testé aucune proposition)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2008, 03h00   #12
Invité de passage
 
Inscription : mai 2004
Messages : 13
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 13
Points : 4
Points : 4
@ Julp : MERCI !

Merci aussi pour l'explication et la démonstration magistrale

Merci aussi à _Mac_

Pour ceux que cela peut aider : la solution 2 de Julp est la meilleure.
sadao est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h07.


 
 
 
 
Partenaires

Hébergement Web