problèmes d'upload..

Eléphanteau du PHP | 11 Messages

14 mai 2006, 16:00

onjour a tous!
voila j'ai un petit problème!
je crée ma gallerie encore en ce moment. et donc mon idée a été de faire que l'admin qui gèrera la gallerie crée un dossier avec le nom de cette gallerie
donc pour cela j'ai créé un formulaire tout simple:
Code : HTML

Code:

Code : Tout sélectionner

<form action="creation.php" method="post"> <input type="text" name="repertoire" /> <input type="submit" name="upload" value="Valider" /> </form>

qui renvoie sur une page qui crée mon dossier: ( dites moi si ce n'est pas assez sécurisé... Smile )

Code : PHP
<?php session_start();

mysql_connect("localhost", "root", "");
mysql_select_db("news");

//Si la variable $_SESSION['logged'] n'existe pas, on la créée.
if (!isset($_SESSION['logged'])) $_SESSION['logged'] = false;
       

{
                if (isset($_POST['repertoire']))
                {
                $rep = htmlentities ($_POST['repertoire']);
                mkdir($rep);
               
                }
               
}
           ?>
Code : HTML
Code:

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" > <head> <title>Bienvenue sur le site de la Corpo</title> <meta http-equiv="refresh" content="0; url=http://127.0.0.1/Site/upload.php?dir=<? echo $rep?>" /> <link href="style.css" rel="stylesheet" type="text/css"/> </head> <body> Connection en cours </body> </html>

j'arrive donc sur ma page d'upload avec le nom du dossier en $_GET['dir']
pour l'upload j'ai repris un script :
ici
http://www.siteduzero.com/tuto-3-1374-1 ... mages.html

que j'ai adapté selon mes besoins.
Je voudrais en fait qu'il uploade l'image directement dans le dossier passé en $_GET['dir']

voila de code de l'upload:
Code : PHP
<?php
$poids_max = 512000; // Poids max de l'image en octets (1Ko = 1024 octets)
$rep = $_GET['dir']; //ici j'ai alterné dans mes tests avec //$repertoire= $_GET['dir'];
$repertoire = 'uploads/'; // Repertoire d'upload

if (isset($_FILES['fichier']))
{
   
   // On vérifie le type du fichier
   if ($_FILES['fichier']['type'] != 'image/png' && $_FILES['fichier']['type'] != 'image/jpeg' && $_FILES['fichier']['type'] != 'image/jpg' && $_FILES['fichier']['type'] != 'image/gif')
   {
      $erreur = 'Le fichier doit être au format *.jpeg, *.gif ou *.png .';
   }
   
   // On vérifit le poids de l'image
   elseif ($_FILES['fichier']['size'] > $poids_max)
   {
      $erreur = 'L\'image doit être inférieur à ' . $poids_max/1024 . 'Ko.';
   }
   
   // On vérifit si le répertoire d'upload existe
   elseif (!file_exists($repertoire))
   {
      $erreur = 'Erreur, le dossier d\'upload n\'existe pas.';     
   }
   
   // Si il y a une erreur on l'affiche sinon on peut uploader
   if(isset($erreur))
   {
      echo '' . $erreur . '<br><a href="javascript:history.back(1)">Retour</a>';
   }
   else
   {
         
// On définit l'extention du fichier puis on le nomme par le timestamp actuel
      if ($_FILES['fichier']['type'] == 'image/jpeg') { $extention = '.jpeg'; }
      if ($_FILES['fichier']['type'] == 'image/jpeg') { $extention = '.jpg'; }
      if ($_FILES['fichier']['type'] == 'image/png') { $extention = '.png'; }
      if ($_FILES['fichier']['type'] == 'image/gif') { $extention = '.gif'; }
      $nom_fichier = time().$extention;
             
      // On upload le fichier sur le serveur.
      if (move_uploaded_file($_FILES['fichier']['tmp_name'], $repertoire.$nom_fichier))
      {
         $url = 'http://monsite/'.$repertoire.''.$nom_fichier.'';
         echo 'Votre image à été uploadée sur le serveur avec succes!<br>Voici le lien: <a href="' . $url . '" >' .$url. '</a>';
                  
                  require("config.inc.php");
                                        mysql_connect($host,$username,$password);
                                        mysql_select_db($bdd_name);
                  
                  mysql_query("INSERT INTO `images` ( `id` , `nom` , `gallerie` ) VALUES ( '', '".$nom_fichier."', '1')");

       
      }
      else
      {
         echo 'L\'image n\'a pas pu être uploadée sur le serveur.';
      }
     
   }
   
}
else
{
   ?>

Code : Tout sélectionner

<form method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $poids_max; ?>"> <input type="file" name="fichier"> <input type="submit" value="Envoyer"> </form> <?php } ?>


et le code php qui va avec.
j'ai changé le $repertoire = 'uploads/';
en $repertoire = $_GET['dir'];
mon script me dit que l'image a été uploadée mais dans le dossier en question il n'y a rien.

je voudrais savoir quoi mettre pour que sa marche correctement, ou si j'ai fait quelque chose qu'il ne fallait pas enfin voila quoi ^^

je vous remercie de votre aide Smile

Eléphanteau du PHP | 28 Messages

14 mai 2006, 16:12

Bonjour,

Pour commencer, je pense que ce n'ets pas une bonne idée de laisser l'utilisateur choisir son nom de dossier. Ce nom pourrait peut etre correspondre à un dossier qui existe déjà. Tu peux peut etre avoir le pseudonyme du membre en nom de dossier si ce pseudonyme est unique.

En tout cas il faut que tu vérifie que le nom de dossier est unique. Il faut aussi que tu penses à ce qu'il va se passer si l'utilisateur met "nom/de/repertoire/" ou des caractères fantaisistes en nom de dossier.


Pour l'upload, tu utilises des chemins relatifs. Il faut donc que tu vérifie où est ton script sur le serveur et aussi si il est appellé par un autre script ou non.

A priori ta variable $repertoire doit être ainsi :

Code : Tout sélectionner

$repertoire = 'upload/'.$_GET['dir'];
Là encore il faut que tu penses à ce qu'il va se passer si un utilisateur change la valeur de ta variable $_GET['dir']...

Eléphanteau du PHP | 11 Messages

14 mai 2006, 16:42

je pense que je vais faire quelque chose d'un peu plus simple au niveau de l'upload.

je vais tout uploader dans le dossier /'uploads'/
mais a chaque upload j'entre dans la base de donnée un id de l'image en auto increment, le nom de l'image et la gallerie auquelle elle appartient.
comme sa quand je voudrais afficher gallerie par gallerie
j'aurais qu'a faire un SELECT nom_image FROM gallerie WHERE ...

c'est pas un peu plus simple? :p

Eléphanteau du PHP | 28 Messages

14 mai 2006, 17:33

Oui je pense que ce sera plus simple.

Par contre, plus ton site est important plus il y a des chances que deux utilisateurs uploadent une photo au meme moment.
Donc si vraiment les chances sont grande je te conseille de nommer tes images "pseudo_time.extension"

Eléphanteau du PHP | 11 Messages

14 mai 2006, 18:05

ah ouai je vois ce que tu veux dire...
si deux images on le même timestamp sa risque de faire grabuge -_-'
le site c'est pour une association de l'université
donc en gros yauras jamais plus d'un voire deux uploadeur qui seront connectés simultanément et je pense qu'au grand max 200 inscrits sur le site. ( le rang d'uploadeur n'est pas donné a tout le monde :) )

donc sa m'étonnerais fortement que ce problème survienne...

si vous avez d'autres conseil pour m'aider dans ma démarche je suis toute ouïe :)

Eléphanteau du PHP | 28 Messages

14 mai 2006, 18:13

Je pense que je t'ai donnée tous les conseils qui me passait par la tête là ... Tu peux aussi mettre time()+microtime() pour vraiment être sur qu'il n'y ai pas de doublons.

Une solution consiste a faire un enregistrement dans la table. Si cet enregistrement réussi, on récupère l'identifiant qui a été généré par l'autoincrement. Cet identifiant sert de nom à l'image.
Ensuite si l'upload échoue on supprime cet enregistrement.

Comme ça, tu es sur de ne pas avoir de doublon et dans le champ nom tu as juste à stocker l'extension du fichier.

A noter que pour l'upload d'image, tu peux te renseigner sur la librairie GD qui sert à faire des modifications sur les images via PHP ;)

Eléphanteau du PHP | 11 Messages

14 mai 2006, 18:27

oui je connais un peu =)
j'ai appris tout sa sur le site du zero :p
je verrais par la suite si je met le logo de mon site en filigranne ou un truc du genre ^^

merci en tout cas je prend bien note de tout sa ;)

Eléphanteau du PHP | 28 Messages

14 mai 2006, 18:30

Oki ;) Pas mal de gens commencent avec ce site. Moi je connaissais pas alors j'ai fait sans. ^^

Si ça marche pense à mettre "Résolu".