Page 1 sur 1

Uploader un fichier

Posté : 05 nov. 2005, 22:06
par Gakman
Bonjour !
Je cherche un tuto pour uploader avec PHP des fichiers sur un serveur.

En fait je voudrais faire une page avec le formulaire pour rentrer son nom et d'autres renseigenements et choisir ses fichiers, et que sur la 2e page, qui cré les dossiers, et mettrais dedans les fichiers.

Merci !

Posté : 05 nov. 2005, 22:20
par MithrandiR
Bonsoir,
En voici un:
Upload de fichiers
C'est celui de PHPFrance.

Posté : 06 nov. 2005, 00:31
par Gakman
Voilà ce que j'ai fait :
rub_post.php
<?
/*
jeu = nouveau jeu (jeu=new)
    = sauvegarde (jeu=*)
com = commentaire (com=* avec *=numéro de la sauvegarde)

script pour ajout jeu / -> sauvegarde / commentaire
*/
?>

<p align="center" class="gdtitre">Soumettre un fichier</p>
<hr />
<p>Vous pouvez ici m'envoyer vos sauvegardes.</p>
<p>&nbsp;</p>
<form action="index.php?lang=<?=$_GET['lang']?>&rub=post_rez&jeu=<?=$_GET['jeu']?>" method="post" enctype="multipart/form-data" id="post_script" name="post_script">
<p>Pseudo : <input name="auteur" id="auteur" /> (utilisez celui du forum SVP)</p>
<p>Adresse E-mail : <input id="mail" name="mail" /></p>
<p>Site perso : <input id="site" name="site" /></p>
<? if ($_GET['jeu']=="new") {echo '<p>Nom du jeu : <input id="nom" name="nom" /></p>';} ?>
<p>Support du jeu :  
<select id="support" name="support">
<option selected>Windows</option>
<option>DreamCast</option>
<option>MegaDrive / Genesis</option>
<option>MasterSystem</option>
<option>GameGear</option>
<option>XBox</option>
<option>PlayStation 2</option>
<option>PlayStation</option>
<option>PSP</option>
<option>GameCube</option>
<option>Nintendo64</option>
<option>SuperNintendo / SNES / SuperFamicom</option>
<option>Nintendo / NES / Famicom</option>
<option>DS</option>
<option>GameBoy Advance</option>
<option>GameBoy / GameBoy Color</option>
<option>NGage</option>
<option>arcade</option>
<option>Linux</option>
<option>MacOS</option>
<option>Amiga</option>
</select></p>
<p>Titre de la sauvegarde  : <input id="titre" name="titre" /></p>
<p>Note (en %) donnée à l'avancement de la sauvegarde :
<select id="note" name="note">
<option selected>Non notée</option>
<? for($i=1;$i<=100;$i++){echo'<option>'.$i.'</option>';} ?>
</select></p>
<p>Vos commentaires et d&eacute;tails sur cette sauvegarde :<br /><textarea id="commentaire" name="commentaire" rows="6" cols="75"></textarea></p>

<input type="hidden" name="MAX_FILE_SIZE" value="100000000" />
<fieldset>
<p class="base_Rouge">S&eacute;lectionnez le(s) fichier(s) que vous voulez envoyer :<br />
<? for($i=1;$i<=10;$i++){echo'<label for="fichier_'.$i.'">Fichier'.$i.' :</label><input id="fichier_'.$i.'" name="fichier_'.$i.'" type="file" size="40" /><br />';} ?>
</p>
</fieldset>

<p><input name="post_submit" id="post_submit" type="submit" value="Envoyer" /></p>
</form>


<p>&nbsp;</p>
<p>&nbsp;</p>
<? include("m_retour.php"); include("m_stats.php");?>
rub_post_rez.php
<p class="titre">Merci !</p>
<?
$jeu_=$_GET['jeu'];
$lang_=$_GET['lang'];

if ($_GET['jeu']=="new"){
 $liste6=array();
 $handle6=opendir(".");
  while($file6=readdir($handle6)){
   $pt6=strrpos($file6,".");
   $folder_name=$file6;
   $fich6=$file6."/nom.php";
   if (@file_exists($fich6)){
    array_push($liste6,$file6);}}
 closedir($handle6);
 $num_new2=count($liste6);
 $num_new2++;
 $dossier_j="j_".$num_new2;
 mkdir ($dossier_j,0700);
 copy("./images/index.htm",$dossier_j."/index.htm");

 $dossier_s_new="s_1";

 $nom_jeu=$_POST["nom"];
 $Fnm3=$dossier_j."/nom.php";
 $inF3=fopen($Fnm3,"w");
  fwrite($inF3,$nom_jeu);
 fclose($inF3);
}
else {
 $dossier_j="j_".$_GET['jeu'];
 $liste5=array();
 $handle5=opendir($dossier_j);
  while($file5=readdir($handle5)){
   $pt5=strrpos($file5,".");
   $folder_name=$file5;
   $num5=substr($file5,2); // supprimable
   $fich5=$dossier_j."/".$file5."/details.php";
   if (@file_exists($fich5)){
    array_push($liste5,$num5);}} // remplacer $num5 par $file5 si supprimé
 closedir($handle5);
 $num_new=count($liste5);
 $num_new++;
 $dossier_s_new="s_".$num_new;
}

mkdir ($dossier_j."/".$dossier_s_new,0700);
copy("./images/index.htm",$dossier_j."/".$dossier_s_new."/index.htm");

$Fnm=$dossier_j."/".$dossier_s_new."/details.php";
$ouvre_w = '<'.'?';
$ferme_w = '?'.'>';
$auteur_w = '$auteur="'.$_POST["auteur"].'";';
$mail_w = '$mail="'.$_POST["mail"].'";';
$site_w = '$site="'.$_POST["site"].'";';
$titre_w = '$titre="'.$_POST["titre"].'";';
$note_w = '$note="'.$_POST["note"].'";';
$date_w = '$date="'.date("d/m/Y").'";';

$inF=fopen($Fnm,"w");
 fwrite($inF,$ouvre_w."\n".$auteur_w."\n".$mail_w."\n".$site_w."\n".$titre_w."\n".$date_w."\n".$note_w."\n".$ferme_w);
fclose($inF);

$commentaire_w=$_POST["commentaire"];
$Fnm2=$dossier_j."/".$dossier_s_new."/commentaire.php";
$inF2=fopen($Fnm2,"w");
 fwrite($inF2,$commentaire_w);
fclose($inF2);

$sujet="Ajout d'une sauvegarde sur S.O.S. Sauvegardes !";
$corps="
 auteur : ".$auteur_w." \n
 mail : ".$mail_w." \n
 site : ".$site_w." \n
 date : ".$date_w." \n
 jeu : ".$_GET['jeu']." \n
 nom du jeu (si nouveau) : ".$nom_jeu." \n
 titre : ".$titre_w." \n
 note : ".$note_w." \n \n
 commentaire : \n".$commentaire_w;
$entete="From:".$email2."\r\nReply-To:".$email2;
mail ($email1,$sujet,$corps,$entete); 


if(isset($_FILES['photo'])){
unset($erreur);
$extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'zip', 'rar', '7z', 'vmi', 'vms', 'ddc');
//faille sécu ici -> voir PHPfrance pour le "denied extensions" à la place
$taille_max = 83886080;
$dest_dossier = $dossier_j."/".$dossier_s_new."/";
if( !in_array( substr(strrchr($_FILES['fichier']['name'], '.'), 1), $extensions_ok ) )
     {    $erreur = 'Veuillez sélectionner un fichier de type zip, rar, 7z, png, gif, jpg, vmi, vms, ddc !';    }
elseif( file_exists($_FILES['fichier']['tmp_name']) and filesize($_FILES['fichier']['tmp_name']) > $taille_max)
     {    $erreur = 'Vos fichiers doivent faire moins de 80Mo !';  }
if(!isset($erreur))  {
    $dest_fichier = basename($_FILES['fichier']['name']);
$dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
move_uploaded_file($_FILES['fichier']['tmp_name'], $dest_dossier . $dest_fichier);
}}




if($jeu_=="new"){echo '<p>&nbsp;</p><p><a href="index.php?lang='.$_GET['lang'].'&rub=liste&jeu='.$num_new2.'">Accès à la page du jeu.</a></p><p>&nbsp;</p>';}
else{echo '<p>&nbsp;</p><p><a href="index.php?lang='.$_GET['lang'].'&rub=liste&jeu='.$_GET['jeu'].'">Retour à la page du jeu.</a></p><p>&nbsp;</p>';}

include("m_retour.php"); include("m_stats.php");
?>
Voilà.
La création des dossiers et fichiers marche bien mais l'upload des fichiers par le visiteur lui ne fonctionne pas.
Je ne trouve pas l'erreur en fait... (P.S.: mon site est chez Free si ça change quelque chose)

Posté : 06 nov. 2005, 00:34
par Cyrano
Bon, et alors... ? :shock:

Il y a une question avec ça ?

Posté : 06 nov. 2005, 00:37
par Gakman
l'upload des fichiers ne fonctionne pas -> je l'ai écrit en dessous.

L'envoi est dans la première des 2 pages :
<p class="base_Rouge">S&eacute;lectionnez le(s) fichier(s) que vous voulez envoyer :<br /> 
<? for($i=1;$i<=10;$i++){echo'<label for="fichier_'.$i.'">Fichier'.$i.' :</label><input id="fichier_'.$i.'" name="fichier_'.$i.'" type="file" size="40" /><br />';} ?> 
</p> 
Le traitement dans la seconde :
if(isset($_FILES['photo'])){ 
unset($erreur); 
$extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'zip', 'rar', '7z', 'vmi', 'vms', 'ddc'); 
//faille sécu ici -> voir PHPfrance pour le "denied extensions" à la place 
$taille_max = 83886080; 
$dest_dossier = $dossier_j."/".$dossier_s_new."/"; 
if( !in_array( substr(strrchr($_FILES['fichier']['name'], '.'), 1), $extensions_ok ) ) 
     {    $erreur = 'Veuillez sélectionner un fichier de type zip, rar, 7z, png, gif, jpg, vmi, vms, ddc !';    } 
elseif( file_exists($_FILES['fichier']['tmp_name']) and filesize($_FILES['fichier']['tmp_name']) > $taille_max) 
     {    $erreur = 'Vos fichiers doivent faire moins de 80Mo !';  } 
if(!isset($erreur))  { 
    $dest_fichier = basename($_FILES['fichier']['name']); 
$dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy'); 
$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier); 
move_uploaded_file($_FILES['fichier']['tmp_name'], $dest_dossier . $dest_fichier); 
}} 
Merci de votre aide !

Posté : 06 nov. 2005, 00:47
par Cyrano
Et quels sont les messages d'erreur ?

Posté : 06 nov. 2005, 00:52
par Gakman
aucun.
les pages sont en place sur mon site http://gakman.free.fr. il suffit de cliquer "liste de jeux" dans le menu à gauche et en bas de la liste il y a le lien pour poster.
On arrive sur le formulaire (rub_post.php) et ne validant on passe à rub_post_rez.php.
Les pages devant être générées le sont mais les fichiers uploadés par le visiteur ne me parviennent pas.

Le problème ne vient-il pas de ça ?
$_FILES['fichier']['name']
En effet j'ai 10 fichiers possibles identifiés fichier_1 à fichier_10.

Posté : 06 nov. 2005, 01:44
par Truc
non pas de cette ligne que tu montre mais du test un peu plus tot.
if(isset($_FILES['photo']))
tu peut me dire ou tu as un champ de type "file" et qui a comme nom "photo" ?
ah, les copier coller :wink:
remplace par
if(isset($_FILES['fichier_1']))
mais la c'est valable que pour le 1er champ, j'en suis pas sur mais je pense que tu dois refaire autant d'appel au script d'upload que tu as de champs de type file. Et toujours faire les test avec "fichier_1" puis avec "fichier_2" et ainsi de suite au lieu de ne prendre que "fichier" qui n'esiste pas.

Posté : 06 nov. 2005, 10:04
par Cyrano
aucun.
les pages sont en place sur mon site http://gakman.free.fr. il suffit de cliquer "liste de jeux" dans le menu à gauche et en bas de la liste il y a le lien pour poster.
Sur un serveur de production, les erreurs ne sont pas affichées: ça donne quoi en local ?

Posté : 06 nov. 2005, 12:27
par Gakman
Je viens de modifier le script pour mettre un seul fichier à uploader pour éviter les problèmes de nom, et toujours pareil.
<p class="base_Rouge">S&eacute;lectionnez le(s) fichier(s) que vous voulez envoyer :<br />
<label for="fichier">Fichier :</label><input id="fichier" name="fichier" type="file" size="40" /><br />
</p>
if(isset($_FILES['fichier'])){
unset($erreur);
$extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'zip', 'rar', '7z', 'vmi', 'vms', 'ddc');
//faille sécu ici -> voir PHPfrance pour le "denied extensions" à la place
$taille_max = 83886080;
$dest_dossier = $dossier_j."/".$dossier_s_new."/";
if( !in_array( substr(strrchr($_FILES['fichier']['name'], '.'), 1), $extensions_ok ) )
     {    $erreur = 'Veuillez sélectionner un fichier de type zip, rar, 7z, png, gif, jpg, vmi, vms ou ddc !';    }
elseif( file_exists($_FILES['fichier']['tmp_name']) and filesize($_FILES['fichier']['tmp_name']) > $taille_max)
     {    $erreur = 'Vos fichiers doivent faire moins de 80Mo !';  }
if(!isset($erreur))  {
    $dest_fichier = basename($_FILES['fichier']['name']);
$dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
move_uploaded_file($_FILES['fichier']['tmp_name'], $dest_dossier . $dest_fichier);
}}

Posté : 06 nov. 2005, 13:40
par Gakman
Sur un serveur de production, les erreurs ne sont pas affichées: ça donne quoi en local ?
Je viens d'installer EasyPHP. Où dois-je voir les erreurs ?

Posté : 06 nov. 2005, 13:44
par Cyrano
Dans la barre de tâches, tu dois avoir un logo EasyPHP : il donne un menu contextual où tu dois pouvoir accéder à la configuration de PHP (fichier php.ini) : dans ce fichier, la directive display_error doit être à ON et le type d'erreurs affichées à E_ALL (sans rien d'autre après, donc pas de ~ E_WARNING par exemple)

Vérifie ça et relance le serveur apache si tu corriges quelque chose dans le php.ini.

Ensuite, recharge ta page, les erreurs, s'il y en a, doivent apparaître dans ta page directement.

Posté : 06 nov. 2005, 15:58
par Gakman
bon voilà ça marche !
Merci.