Uploader un fichier

Eléphant du PHP | 76 Messages

05 nov. 2005, 22:06

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 !
@++
Gakman
-> http://gakman.free.fr

MithrandiR
Invité n'ayant pas de compte PHPfrance

05 nov. 2005, 22:20

Bonsoir,
En voici un:
Upload de fichiers
C'est celui de PHPFrance.

Eléphant du PHP | 76 Messages

06 nov. 2005, 00:31

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)
Modifié en dernier par Gakman le 06 nov. 2005, 01:31, modifié 1 fois.
@++
Gakman
-> http://gakman.free.fr

Mammouth du PHP | 19672 Messages

06 nov. 2005, 00:34

Bon, et alors... ? :shock:

Il y a une question avec ça ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 76 Messages

06 nov. 2005, 00:37

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 !
Modifié en dernier par Gakman le 06 nov. 2005, 01:32, modifié 1 fois.
@++
Gakman
-> http://gakman.free.fr

Mammouth du PHP | 19672 Messages

06 nov. 2005, 00:47

Et quels sont les messages d'erreur ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 76 Messages

06 nov. 2005, 00:52

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.
@++
Gakman
-> http://gakman.free.fr

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

06 nov. 2005, 01:44

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.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Mammouth du PHP | 19672 Messages

06 nov. 2005, 10:04

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 ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 76 Messages

06 nov. 2005, 12:27

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);
}}
@++
Gakman
-> http://gakman.free.fr

Eléphant du PHP | 76 Messages

06 nov. 2005, 13:40

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 ?
@++
Gakman
-> http://gakman.free.fr

Mammouth du PHP | 19672 Messages

06 nov. 2005, 13:44

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 76 Messages

06 nov. 2005, 15:58

bon voilà ça marche !
Merci.
@++
Gakman
-> http://gakman.free.fr