upload d'image

Mimos@
Invité n'ayant pas de compte PHPfrance

22 nov. 2006, 19:29

Je vous sollicite pour un problème. Est-il possible de choisir le dossier ou l'on veux que l'image s'enregistre.
Je m'explique : dans un dossier image j'ai un dossier dbz, fma, naruto. Puis-je en fonction
d'une liste déroulante choisir un des trois dossiers ?
J'ai essayer comme ceci :
<?php
if(isset($_FILES['photo']) && isset($_POST['manga']))
{
  $lequel = $_POST['manga'];
  $dossier = '/mnt/112/free.fr/b/c/snshinobi/images/$lequel';
  $dir_mini = '/mnt/112/free.fr/b/c/snshinobi/images/mini/$lequel';
  $fichier = $_FILES['photo']['name'];
  $taille_fichier = $FILES['photo']['size'];
  if(substr($fichier, -3)=="jpg" || substr($fichier, -3)=="gif" || substr($fichier, -3)=="png")
  {
    if($taille_fichier <= 4194304)
    {
      if (is_file('/mnt/112/free.fr/b/c/snshinobi/images/$lequel'.$_FILES['photo']['name'])) $file_upload = '_'.$_FILES['photo']['name'];
      else $file_upload = $_FILES['photo']['name'];
      if(move_uploaded_file($_FILES['photo']['tmp_name'], $dossier.'/'.$file_upload))
      {
        echo 'Upload réussi';
          }
      else
      {
        echo 'Erreur dans upload';
      }
   }
   else
   {
     echo 'l image est trop grande. taille maxi 4mo';
   }
 }
 else
 {
   echo 'le fichier n\'est pas une image';
 }
}
?>
<html>
<body>
<form method="post" action="upload.php" enctype="multipart/form-data">
<p><input type="hidden" name="MAX_FILE_SIZE" value="4194304" /></p>
<fieldset>
<legend>Envoi de fichier</legend>
<p>Les formats : jpg, gif, png. Le bmp n'est pas autoriser. Taille maxi est de 4mo</p>
<p><label for="photo">Image: </label><input type="file" name="photo" id="photo" /></p>
   <p>
       <label>
           Choisir un manga ?<br />
           <select name="manga">
               <option value="dbz">Dragon-ball</option>
               <option value="fma">Fullmetal A.</option>
               <option value="naruto">Naruto</option>
           </select>
       </label>
   </p>
<p><input type="submit" value="Envoyer" /></p>
</fieldset>
</form>
</body>
</html>

Mammouth du PHP | 1967 Messages

22 nov. 2006, 19:55

Le principe d'upload, c'est que le fichier est mis dans un repertoire temporaire, et que c'est à toi de le déplacer où tu veux par aprés

Quelle erreur te donne ce script, que fait il que tu ne veux pas qu'il fasse ??
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mimos@
Invité n'ayant pas de compte PHPfrance

22 nov. 2006, 20:04

En faite, je veux en fonction de la sélection dans la liste déroulante déplacer le fichier dans un dossier en rapport avec la selection de la liste. C'est pas très claire.
Voici un exemple :
si dans la liste déroulante je choisie dbz, je veux que l'image se déplace dans le dossier images/dbz. si je choisie fma, je veux que l'image se déplace dans le dossier images/fma.

Mammouth du PHP | 1967 Messages

23 nov. 2006, 00:22

j'ai trés bien compris ce que tu cherche à faire, mais pourquoi ton script ne marche pas, on ne peut pas le deviner, il est bien penser. lorsque tu le fait tourner et que tu le test as-tu des messages d'erreur ou bien un résultat auquel tu t'attend pas qu'on puisse commencer à comprendre ton problème
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mammouth du PHP | 1776 Messages

23 nov. 2006, 00:33

Pour ma part ton script est plus ou moins correct : il n'est pas tout à fait sécurisé !
Mais avant de voir ce soucis, où se pose ton problème ?
As-tu un message d'erreur ? :wink:

ViPHP
fab
ViPHP | 2657 Messages

23 nov. 2006, 01:00

Avant tout :
remplace :
 $dossier = '/mnt/112/free.fr/b/c/snshinobi/images/$lequel';
  $dir_mini = '/mnt/112/free.fr/b/c/snshinobi/images/mini/$lequel';
par :
 $dossier = '/mnt/112/free.fr/b/c/snshinobi/images/'.$lequel;
  $dir_mini = '/mnt/112/free.fr/b/c/snshinobi/images/mini/'.$lequel;
Il faut a tout prix éviter de mélanger les variables avec le "texte" ! :p
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Mammouth du PHP | 1776 Messages

23 nov. 2006, 01:47

Bien Fab, mais j'aurai placé ça au second plan : optimisation :wink:
J'ai beau chercher, je comprend pas quel prob il peut avoir, surtout si il ne nous aiguille pas ? une idée ?

Note : vu qu'on optimise en attendant d'avoir plsu d'infos, faudrait mieux qu'il fasse un switch pour manga, on peut facilement détourner le dossier sinon... :wink:

Mimos@
Invité n'ayant pas de compte PHPfrance

23 nov. 2006, 22:47

$dossier = '/mnt/112/free.fr/b/c/snshinobi/images/'.$lequel;
$dir_mini = '/mnt/112/free.fr/b/c/snshinobi/images/mini/'.$lequel;
Merci fab. J'ai essayer ceci et maintenant sa marche très bien.
Mon problème était qu'il ne voulait pas déplacer l'image car ma variable ne marcher pas.

Code : Tout sélectionner

if (is_file('/mnt/112/free.fr/b/c/snshinobi/images/$lequel'.$_FILES['photo']['name'])) $file_upload = '_'.$_FILES['photo']['name']; else $file_upload = $_FILES['photo']['name']; if(move_uploaded_file($_FILES['photo']['tmp_name'], $dossier.'/'.$file_upload)) {
J'obtenais une erreur dans mon upload à cause du chemin.
Mon problème est donc maintenant résolue.
il n'est pas tout à fait sécurisé
A bon ? peux-tu m'en dire plus ? merci.
faudrait mieux qu'il fasse un switch pour manga, on peut facilement détourner le dossier sinon
Même chose, si on pouvait m'éclairer.

Je m'excuse je ne pouvais répondre avant.

ViPHP
fab
ViPHP | 2657 Messages

23 nov. 2006, 23:12

En fait tu ne vérifie pas le contenu de ta variable $_POST['manga'] je n'ai pas vraiment pris le temps de comprendre ton code mais cette variable devrait contenir le nom d'un fichier ou d'un répertoire, il faut vérifier l'existence de ce fichier ou de ce répertoire.
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Mammouth du PHP | 1776 Messages

23 nov. 2006, 23:14

Déjà ce qu'à it Fab ! Mais imagine que tu as un répertoire images qui contient les images de ton site, qu'un mec à la bonne idée de détourner ton formulaire en envoyant $_POST['manga'] valant "images" et que dedans il place le fichier head.jpg, il pourrait par exemple remplacer ton header de site...

ViPHP
fab
ViPHP | 2657 Messages

23 nov. 2006, 23:22

Au passage remplace aussi :
if (is_file('/mnt/112/free.fr/b/c/snshinobi/images/$lequel'.$_FILES['photo']['name'])) $file_upload = '_'.$_FILES['photo']['name']; 
par
if (is_file('/mnt/112/free.fr/b/c/snshinobi/images/'.$lequel.$_FILES['photo']['name'])) $file_upload = '_'.$_FILES['photo']['name']; 
Sortir les variables du texte est une rigueur qui évite toujours les problèmes.
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Mimos@
Invité n'ayant pas de compte PHPfrance

23 nov. 2006, 23:23

OK merci pour tout. Je vais modifier cela.
On peux mettre mon sujet résolu.

ViPHP
fab
ViPHP | 2657 Messages

23 nov. 2006, 23:29

Faudra aussi penser a t'inscrire ça évitera aux modérateurs d'intervenir pour mettre le tag résolu :p
De plus si tu as questions sur la sécurité tu es bienvenue ici c'est un sujet ou mes compétences sont limités mais cela reste tres intéressant et il y a du monde qualifié pour répondre.
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphanteau du PHP | 11 Messages

24 nov. 2006, 21:01

Bon voila, j'ai franchi le pas, me suis inscrit.
Il est vrai que niveau sécurité j'ai vraiment du mal. et si quelqu'un avait quelque solution.
N'en serait-elle pas une que de renommer le fichier à l'upload ? de plus se serait plus simple pour s'y retrouver en les nomment par exemple, 01.jpg, 02.jpg, 03.png.......
<?php
if(isset($_FILES['photo']) && isset($_POST['manga']))
{
  $lequel = $_POST['manga']; 
  $dossier = '/mnt/112/free.fr/b/c/snshinobi/images/'.$lequel.'/';
  $dir_mini = '/mnt/112/free.fr/b/c/snshinobi/images/mini/'.$lequel.'/';
  $fichier = $_FILES['photo']['name']; 
  $taille_fichier = $FILES['photo']['size'];
  
  if(substr($fichier, -3)=="jpg" || substr($fichier, -3)=="gif" || substr($fichier, -3)=="png")
  {
    if($taille_fichier <= 4194304)
    { 
      if (is_file('/mnt/112/free.fr/b/c/snshinobi/images/'.$lequel.'/'.$_FILES['photo']['name'])) $file_upload = '_'.$_FILES['photo']['name'];
      else $file_upload = $_FILES['photo']['name'];
      if(move_uploaded_file($_FILES['photo']['tmp_name'], $dossier.'/'.$file_upload))
      {
        echo 'Upload réussi';
		
		
		$largeurDestination = 150;
        $hauteurDestination = 150;
	    $miniature = "mini_$fichierSource";
        If (substr($fichier, -3)=="gif")
	    {
          // ceci est une image GIF
	      $image1=imagecreatefromgif($dossier.'/'.$file_upload);
	      $image2=imagecreatetruecolor($largeurDestination, $hauteurDestination);
          $largeurSource = imagesx($image1);
          $hauteurSource = imagesy($image1);
	      imagecopyresized($image2, $image1, 0, 0, 0, 0, $largeurDestination-(2*8), $hauteurDestination-(2*8),   	$largeurSource, $hauteurSource);
	      imagegif($image2, $dir_mini.'/'.$file_upload);
		  echo "<br />Image miniature générée: $miniature";
    	}
    	elseif (substr($fichier, -3)=="jpg")
	    {
	      // ceci est une image JPG
	      $image1=imagecreatefromjpeg($dossier.'/'.$file_upload);
	      $image2=imagecreatetruecolor($largeurDestination, $hauteurDestination);
          $largeurSource = imagesx($image1);
          $hauteurSource = imagesy($image1);
    	  imagecopyresized($image2, $image1, 0, 0, 0, 0, $largeurDestination-(2*8), $hauteurDestination-(2*8),   		$largeurSource, $hauteurSource);
    	  imagejpeg($image2, $dir_mini.'/'.$file_upload);
		  echo "<br />Image miniature générée: $miniature";
    	}
    	elseif (substr($fichier, -3)=="png")
	    {
    	  // ceci est une image png
	      $image1=imagecreatefrompng($dossier.'/'.$file_upload);
	      $image2=imagecreatetruecolor($largeurDestination, $hauteurDestination);
          $largeurSource = imagesx($image1);
          $hauteurSource = imagesy($image1);
	      imagecopyresized($image2, $image1, 0, 0, 0, 0, $largeurDestination-(2*8), $hauteurDestination-(2*8),   	$largeurSource, $hauteurSource);
	      imagepng($image2, $dir_mini.'/'.$file_upload);
          echo "<br />Image miniature générée: $miniature";	   
    	}
		
		
      }
      else
      {
        echo 'Erreur dans upload';
      }
   }
   else
   {
     echo 'l image est trop grande. taille maxi 4mo';
   }
 }
 else
 {
   echo 'le fichier n\'est pas une image';
 }
}
?>
faudrait mieux qu'il fasse un switch pour manga, on peut facilement détourner le dossier sinon
un switch pour manga ? je le passe par une liste déroulante.[/code]
Image

Mammouth du PHP | 1776 Messages

24 nov. 2006, 23:29

Ce n'est parce que ta liste déroulante est correcte qu'on ne peut pas la détourner ! Il faut se mettre dans la tête que tout ce qui est passé par formulaire, url ou cookie est non securisé.

Imagine mon script hebergé sur mon site ou totu simplement sur mon pc...

Code : Tout sélectionner

<form method="post" action="http://www.tonurl.com/upload.php" enctype="multipart/form-data"> input type="file" name="photo" id="photo" /></p> <select name="manga"> <option value="images">Dragon-ball</option> </select> <input type="submit" value="Envoyer" /> </form>
Si je me trompe pas avec ça je fous un bordel phénoménal :roll:

et effectivement il serait judicieux de renommer les fichiers (en tout cas moi je le fais par défaut)