[RESOLU]Probleme upload fichier

Eléphant du PHP | 299 Messages

23 juin 2012, 15:52

Hello,

j' ai un souci que je n' arrive pas a resoudre.

Je fais un formulaire d' inscription avec un fichier image.

Le tout fonctionne trés bien a un détail prés.

Mon fichier est renommé avant envoi dans la bdd avec un préfixe de timestamp du genre:

2546546543_monfichier.gif

Ok, ca roule.

Probleme, je voudrai que si aucun fichier n' est envoyé, que le champs de la bdd soit evidemment vide.

Hors soit je me retrouve avec le nom complet, soit avec le prefixe seulement.

4765765465_

DOnc voila, je galere pour des c*nneries mais bon, je cherche toujours en attendant une reponse, isset n' y a rien fait.

<?php
	$extensions = array('.png', '.gif', '.jpg', '.jpeg');
	$photo4 = time()."_".$_FILES['photo']['name'];
	$taille4 = filesize($_FILES['photo']['tmp_name']);
	$extension4 = strrchr($_FILES['photo']['name'], '.');
	$dossier4 = '/home/bernayin/www/images/profils/';
	
	
	if(!in_array($extension4, $extensions)) //Si l'extension n'est pas dans le tableau
{
     $erreur = 'Vous devez uploader un fichier de type png, gif, jpg, jpeg...<br><br> Taille de la photo maxi : 500000 Ko';
}
if($taille4>$taille_maxi)
{
     $erreur = 'Le fichier est trop gros...';
}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
     //On formate le nom du fichier ici...
     $photo4 = strtr($photo4, 
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $photo4 = preg_replace('/([^.a-z0-9]+)/i', '-', $photo4);
	 }
     move_uploaded_file($_FILES['photo']['tmp_name'], $dossier4 . $photo4) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
	 ?>
     <?php
			 if(isset($_FILES['photo'])&&$_FILES['photo']
{
			 mysql_query("INSERT INTO bernay_users VALUES('', '$pseudo', '$nom', '$prenom', '$mdp', '$email', '$born', '$adresse', '$cp', '$ville', '$tel', '$societe', '$siren', '$enseigne', '$logo', '$qs', '$rs', '$inscrit', '1', '$photo4')");
}
else
{
 mysql_query("INSERT INTO bernay_users VALUES('', '$pseudo', '$nom', '$prenom', '$mdp', '$email', '$born', '$adresse', '$cp', '$ville', '$tel', '$societe', '$siren', '$enseigne', '$logo', '$qs', '$rs', '$inscrit', '1', '$photo4')");
}
?>
Modifié en dernier par graffx le 24 juin 2012, 01:16, modifié 1 fois.

ViPHP
xTG
ViPHP | 7331 Messages

23 juin 2012, 15:59

La déclaration de $photo4 doit être de ce type :
$photo4 = isSet($_FILES['photo']['name']) ? time()."_".$_FILES['photo']['name'] : '';
Et tu dois mettre le move_uploaded dans le if précédent.
Ainsi $photo4 sera vide en cas de fichier non renseigné par l'utilisateur et tu ne généreras pas d'erreur sur le move_uploaded.

Eléphant du PHP | 299 Messages

23 juin 2012, 16:46

Comment ca dans le if précédent?

ViPHP
xTG
ViPHP | 7331 Messages

23 juin 2012, 17:13

cf ton code :
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
     //On formate le nom du fichier ici...
     $photo4 = strtr($photo4,
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $photo4 = preg_replace('/([^.a-z0-9]+)/i', '-', $photo4);
}
move_uploaded_file($_FILES['photo']['tmp_name'], $dossier4 . $photo4) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...

Eléphant du PHP | 299 Messages

23 juin 2012, 18:23

Donc ok,je fais comme tu dis:
Code php
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
     //On formate le nom du fichier ici...
     $photo4 = strtr($photo4,
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $photo4 = preg_replace('/([^.a-z0-9]+)/i', '-', $photo4);
    move_uploaded_file($_FILES['photo']['tmp_name'], $dossier4 . $photo4) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
}
j' ai droit a un :

Parse error: syntax error, unexpected '}' in

alors que les crochets sont bien ouverts et fermés.

ViPHP
xTG
ViPHP | 7331 Messages

23 juin 2012, 18:24

Il manque un point virgule. ;)
Cela ne posait pas problème avant car il n'y avait pas d'instruction après, mais là il y a l'accolade fermante du if.

Eléphant du PHP | 299 Messages

23 juin 2012, 19:12

Alors evidemment plus d'erreur, mais le probleme persiste, lorsque je ne choisis pas de fichier dans le formulaire, j' ai dans la base le timestamp:


654464654654_



Je remet ce que tu m' a dmeandé de faire au cas ou:
   <?php
	$extensions = array('.png', '.gif', '.jpg', '.jpeg');
	
	$photo4 = isSet($_FILES['photo']['name']) ? time()."_".$_FILES['photo']['name'] : '';
	
	$taille4 = filesize($_FILES['photo']['tmp_name']);
	$extension4 = strrchr($_FILES['photo']['name'], '.');
	$dossier4 = '/home/bernayin/www/images/profils/';
	
	
	if(!in_array($extension4, $extensions)) //Si l'extension n'est pas dans le tableau
{
     $erreur = 'Vous devez uploader un fichier de type png, gif, jpg, jpeg...<br><br> Taille de la photo maxi : 500000 Ko';
}
if($taille4>$taille_maxi)
{
     $erreur = 'Le fichier est trop gros...';
}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
     //On formate le nom du fichier ici...
     $photo4 = strtr($photo4, 
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $photo4 = preg_replace('/([^.a-z0-9]+)/i', '-', $photo4);
	 move_uploaded_file($_FILES['photo']['tmp_name'], $dossier4 . $photo4); //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
}
     
	 
			?>
     <?php 
			 mysql_query("INSERT INTO bernay_users VALUES('', '$pseudo', '$nom', '$prenom', '$mdp', '$email', '$born', '$adresse', '$cp', '$ville', '$tel', '$societe', '$siren', '$enseigne', '$logo', '$qs', '$rs', '$inscrit', '1', '$photo4')");

ViPHP
xTG
ViPHP | 7331 Messages

23 juin 2012, 19:21

Hum oui pardon, empty et non isset :
$photo4 = (!empty($_FILES['photo']['name'])) ? time()."_".$_FILES['photo']['name'] : '';

ViPHP
AB
ViPHP | 5818 Messages

23 juin 2012, 20:35

Et pourquoi tu fais pas
if(move_uploaded_file($_FILES['photo']['tmp_name'], $dossier4 . $photo4))
{
     mysql_query(...);
}
ainsi cela conditionnerait l'insertion en base de donnée à l'upload d'un fichier.

Mais il a pas mal d'autres erreurs dans ton script :

- Tu définis $taille4 et $extension4 en fonction de variables dont tu n'as pas vérifié préalablement l'existence :
$taille4 = filesize($_FILES['photo']['tmp_name']);
$extension4 = strrchr($_FILES['photo']['name'], '.');
- Si deux upload sont réalisés au même instant un des deux fichiers va écraser l'autre.

- Manque aussi la gestion des erreurs qui finit toujours pas se manifester un jour ou l'autre si dépassement de la valeur "post_max_size" du serveur.

Pour plus d'information sur ces sujets tu peux regarder ce tuto

Eléphant du PHP | 299 Messages

24 juin 2012, 01:15

Merci pour tous, tu as résolus le soucis.

C'est rare de trouver un forum vraiment efficace. Bravo a toi et merci a phpfrance pour son existence!

Merci aussi pour le tuto, je vais lire ca pour la gestion des erreurs, pour deux upload simultanées aussi.

Merci encore =D>

ViPHP
AB
ViPHP | 5818 Messages

24 juin 2012, 04:55

Merci pour tous, tu as résolus le soucis.

C'est rare de trouver un forum vraiment efficace. Bravo a toi et merci a phpfrance pour son existence!

Merci aussi pour le tuto, je vais lire ca pour la gestion des erreurs, pour deux upload simultanées aussi.

Merci encore =D>
Merci, les remerciements font toujours plaisir :) (parfois ont a l'air d'être considéré par certains comme un simple SAV gratuit :( )

Pour comprendre le principe le mieux est de suivre le tuto.
Mais pour une utilisation sur site, la classe donnée en lien dans le tuto est plus optimisée et plus performante. Elle sait faire beaucoup plus de choses en option : imposer un nom de fichier, renommer des fichiers, redimensionner des images, gère le multi upoload ... et gère plus d'erreurs, tout ça avec beaucoup moins de code à écrire (une ligne par option).
Evidemment le mode d'emploi peut paraitre assez long puisqu'il détaille toutes les options, mais tu n'es pas obligé de lire la doc pour les options que tu n'utilise pas, et ce sera toujours beaucoup moins long que de développez le script toi-même (qui au final serait à très peu près identique pour les mêmes fonctionnalités). Et puis comme cette classe a été utilisée de nombreuses fois on peut être sûr qu'elle fonctionne correctement :)