Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/11/2007, 12h07   #1
Membre du Club
 
William RICHARD
Inscription : septembre 2007
Messages : 156
Détails du profil
Informations personnelles :
Nom : William RICHARD
Âge : 30
Localisation : France, Aube (Champagne Ardenne)

Informations forums :
Inscription : septembre 2007
Messages : 156
Points : 68
Points : 68
Par défaut [Upload] Upload en local

dsl c'est encore moi.

formulaire avec upload de photo, je me suis largement
basé sur un tuto du site, j'ai fait la base...
et ça marche pas.
le but est de placé la photo dans un dossier précis et de
mettre seulement le chemin dans la base.

Q1: je suis en local, si je test l'upload est ce que ça joue ?

Q2: y a-t-il une boulette dans mon schmilblik?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
if(isset($_FILES['photo']))
{
  // params
  unset($erreur);
  $extensions_ok = array('bmp', 'gif', 'jpg', 'jpeg');
  $taille_max = 25000;
  $dest_dossier = 'C:/.../photo/';
  // vérifications
  if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
  {
    $erreur = 'Pour votre photo veuillez sélectionner un fichier de type bmp, gif ou jpg !';  
  }
  elseif( file_exists($_FILES['photo']['tmp_name']) 
          and filesize($_FILES['photo']['tmp_name']) > $taille_max)
  {
    $erreur = 'Votre fichier doit faire moins de 25Ko !';
  }
  // copie du fichier
  if(!isset($erreur))
  {
    $dest_fichier = basename($_FILES['photo']['name']);
    // formatage nom fichier
    // enlever les accents
    $dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    // remplacer les caracteres autres que lettres, chiffres et point par _
    $dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
    // copie du fichier
    move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier);
    chmod($dest_fichier, 0755);
  }
}
dans le même script j'ai un UPDATE
en bdd qui marche bien avant ça et un header après qui
fonctionne aussi.
warwill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2007, 13h19   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par warwill
ça ne marche pas
Mais encore ?

Citation:
Envoyé par warwill
le but est de placé la photo dans un dossier précis et de
mettre seulement le chemin dans la base
Cette deuxième partie (liée à la base) n'est pas montrée ici. Est-ce volontaire ?

Citation:
Envoyé par warwill
Q1: je suis en local, si je test l'upload est ce que ça joue ?
Non, pas par rapport à votre code qui semble ici être portable (respecte la séparation client/serveur).

Citation:
Envoyé par warwill
Q2: y a-t-il une boulette dans mon schmilblik?
Doit-on chercher quelque chose de particulier ?

Le résultat de la fonction move_uploaded_file n'est pas testé donc si le déplacement échoue le chmod échouera aussi (ce serait également l'endroit pour procéder à une insertion/mise à jour de votre base). De plus, le chemin fournit à la fonction chmod est incomplet, je pense qu'il devrait être : $dest_dossier . $dest_fichier.

Dernière chose :
Code :
if(isset($_FILES['photo']))
sera toujours vrai même si aucun fichier n'a été sélectionné par l'utilisateur. Il faudrait utiliser le code d'erreur ou tester que les éléments de ce tableau ne sont pas vides pour déterminer l'absence ou non d'une tentative d'upload.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2007, 17h12   #3
Membre du Club
 
William RICHARD
Inscription : septembre 2007
Messages : 156
Détails du profil
Informations personnelles :
Nom : William RICHARD
Âge : 30
Localisation : France, Aube (Champagne Ardenne)

Informations forums :
Inscription : septembre 2007
Messages : 156
Points : 68
Points : 68
ça marche pas = ça upload pas.
la seconde partie n'est pas encore dans le script
je veux déjà arriver à uploader avant de rajouter
le chemin à la base.le dossier final est toujours
le même, reste le nom de la photo.
existe t il une fonction type mysqlerror() pour l'upload?
je fais toujours mes tests moteur en circonstance parfaites
donc avec le bon type de fichier, la bonne taille...
je vois la sécurité quand ça marche.
c'est la dernière partie de l'inscription des users, donc
en début de script y a juste un UPDATE pour rajouter
la date de création du profil(qui fonctionne bien lui)
puis l'upload (qui upload pas)
et un header pour rediriger vers la page d'accueil.
j'ai changer le chmod mais ça upload toujours pas.

EDIT:alors j'ai retirer le header de la fin et je suis
sur une page blanche comme si il n'y avait pas d'erreur!
j'ai essayé un echo $_FILES['photo']['error'];
il me disait undefined index photo
warwill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2007, 18h39   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par warwill
existe t il une fonction type mysqlerror() pour l'upload?
La fonction move_uploaded_file, si on arrive jusque là, et échoue, affichera un message d'erreur.

Avez-vous bien ajouté enctype="multipart/form-data" à votre balise form ? Que vous donne var_dump($_FILES); en condition ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2007, 18h10   #5
Membre du Club
 
William RICHARD
Inscription : septembre 2007
Messages : 156
Détails du profil
Informations personnelles :
Nom : William RICHARD
Âge : 30
Localisation : France, Aube (Champagne Ardenne)

Informations forums :
Inscription : septembre 2007
Messages : 156
Points : 68
Points : 68
désolé de tout ce temps,j'étais très occupé.
donc le enctype est la première chose que
j'ai vérifié; avant de poster je lis les autre poste
qui pourrai me concerner et j'avais déjà vu cette
remarque donc j'ai vérifié.il est ok.

Citation:
Que vous donne var_dump($_FILES); en condition ?
je ne sais pas, mais ça vient surtout du fait que je
comprend pas la question.
warwill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2007, 12h26   #6
Membre du Club
 
William RICHARD
Inscription : septembre 2007
Messages : 156
Détails du profil
Informations personnelles :
Nom : William RICHARD
Âge : 30
Localisation : France, Aube (Champagne Ardenne)

Informations forums :
Inscription : septembre 2007
Messages : 156
Points : 68
Points : 68
j'ai modifié un peu mon script, suite à la lecture
des autres post sur l'upload.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
if(isset($_POST['profil4']))
{
  // params
  unset($erreur);
  $extensions_ok = array('bmp', 'gif', 'jpg', 'jpeg');
  $taille_max = 25000;
  $dest_dossier = 'C:/.../photo/';
  // vérifications
  if( !in_array( substr(strrchr($_FILES['avatar']['name'], '.'), 1), $extensions_ok ) )
  {
    $erreur = 'Pour votre avatar veuillez sélectionner un fichier de type bmp, gif ou jpg !';  
  }
  elseif( file_exists($_FILES['avatar']['tmp_name'])
          and filesize($_FILES['avatar']['tmp_name']) > $taille_max)
  {
    $erreur = 'Votre fichier doit faire moins de 25Ko !';
  }
  // copie du fichier
  if(!isset($erreur))
  {
    $dest_fichier = basename($_FILES['avatar']['name']);
    // formatage nom fichier
    // enlever les accents
    $dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    // remplacer les caracteres autres que lettres, chiffres et point par _
    $dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
    // copie du fichier
    if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dest_dossier . $dest_fichier))
	{
    chmod($dest_dossier.$dest_fichier, 0755);
	echo "photo transférer avec succès";
	}
  }
}
else
{
echo "le formulaire n'a pas été télécharger";
}
et quand je valide j'obtiens plus de renseignement :
"le formulaire n'a pas été télécharger"

je ne comprend plus rien! j'ai 4 pages à la suite,toutes
sur le meme modèle, les 3 premier form font bien leur boulot
et pas celui la! cela vient-il de mon script? de ma page?
warwill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2007, 13h44   #7
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Ce résultat laisse supposer que votre formulaire ne possède aucun champ nommé profil4 (à moins que vous n'utilisiez la méthode GET au lieu de POST). Est-ce le cas et à quoi correspond-il ? Peut-on avoir le code du formulaire pour commencer s'il n'est pas trop long ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2007, 14h00   #8
Membre du Club
 
William RICHARD
Inscription : septembre 2007
Messages : 156
Détails du profil
Informations personnelles :
Nom : William RICHARD
Âge : 30
Localisation : France, Aube (Champagne Ardenne)

Informations forums :
Inscription : septembre 2007
Messages : 156
Points : 68
Points : 68
je croyais qu'il s'agissait de vérifié l'existence du formulaire!

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
<form name="profil4" method="post"
 action="uplodphoto.php" enctype="multipart/from-data">
  <table align="center" border="0" cellpadding="0"
 cellspacing="0" width="470">
    <tbody>
       <tr>
        <td style="height: 24px; width: 147px;" class="formu">Avatar</td>
        <td style="height: 24px; width: 277px;" class="formu">&nbsp;taille
max : 90x90 &nbsp; &nbsp; &nbsp; &nbsp;poids max : 10 ko</td>
        <td style="height: 24px;" class="formu">&nbsp;</td>
      </tr>
      <tr>
        <td style="height: 26px; width: 147px;" class="formu">un
petit portrait de vous<br>
        </td>
        <td style="height: 26px; width: 277px;" class="formu"><span
 class="petit"><input name="avatar" id="avatar"
 size="20" maxlength="60" type="file"></span></td>
        <td style="height: 26px;" class="formu"
 width="18">&nbsp;</td>
      </tr>
      <tr>
        <td style="width: 277px;" colspan="4"
 class="formuplein">&nbsp;</td>
      </tr>
      <tr>
        <td style="width: 277px;" colspan="4"
 class="formuplein">
        <div align="center"><input name="valider"
 id="valider" value="valider" type="submit"></div>
        </td>
      </tr>
      <tr>
        <td style="width: 277px;" colspan="4"
 class="formu">&nbsp; </td>
      </tr>
    </tbody>
  </table>
</form>
voila le formulaire.
j'ai donc modifié le script en remplaçant le nom du form par
le nom du champ,'avatar'.
j'obtiens ceci:
Undefined index: avatar in C:\...\uplodphoto.php on line 16

voici la ligne 16:
Code :
if( !in_array( substr(strrchr($_FILES['avatar']['name'], '.'), 1), $extensions_ok ) )
warwill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2007, 14h06   #9
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Code :
1
2
<form name="profil4" method="post"
 action="uplodphoto.php" enctype="multipart/from-data">
1. Il y a une faute de frappe sur l'enctype : multipart/form-data (pas from) et qui explique que $_FILES n'existe pas.
2. L'attribut name (ou même id) du formulaire (balise form) ne joue aucune rôle lors de sa transmission : vous n'obtiendrez pas cette information à sa réception, pour traitement. Il vous faut donc revoir votre test :
Code :
if(isset($_POST['profil4']))
(pour voir ce qui vous est transmis, il n'y a qu'à observer le résultat de :
et éventuellement $_FILES lorsqu'il y a upload)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2007, 14h35   #10
Membre du Club
 
William RICHARD
Inscription : septembre 2007
Messages : 156
Détails du profil
Informations personnelles :
Nom : William RICHARD
Âge : 30
Localisation : France, Aube (Champagne Ardenne)

Informations forums :
Inscription : septembre 2007
Messages : 156
Points : 68
Points : 68
j'ai corrigé la faute

j'ai donc modifié le script comme suit:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
var_dump($_POST);
if(isset($_POST['avatar']))
{
  // params
  unset($erreur);
  $extensions_ok = array('bmp', 'gif', 'jpg', 'jpeg');
  $taille_max = 25000;
  $dest_dossier = 'C:/.../photo/';
  // vérifications
  if( !in_array( substr(strrchr($_FILES['avatar']['name'], '.'), 1), $extensions_ok ) )
  {
    $erreur = 'Pour votre avatar veuillez sélectionner un fichier de type bmp, gif ou jpg !';  
  }
  elseif( file_exists($_FILES['avatar']['tmp_name'])
          and filesize($_FILES['avatar']['tmp_name']) > $taille_max)
  {
    $erreur = 'Votre fichier doit faire moins de 25Ko !';
  }
  // copie du fichier
  if(!isset($erreur))
  {
    $dest_fichier = basename($_FILES['avatar']['name']);
    // formatage nom fichier
    // enlever les accents
    $dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    // remplacer les caracteres autres que lettres, chiffres et point par _
    $dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
    // copie du fichier
    if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dest_dossier . $dest_fichier))
	{
    chmod($dest_dossier.$dest_fichier, 0755);
	echo "photo transférer avec succès";
	}
  }
}
else
{
echo "le formulaire n'a pas été télécharger";
}
j'obtiens:
undefined index avatar on line 17
à savoir celle-ci:
Code :
  if( !in_array( substr(strrchr($_FILES['avatar']['name'], '.'), 1), $extensions_ok ) )
warwill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2007, 16h54   #11
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Si le test suivant :
Code :
if(isset($_POST['avatar']))
fonctionne et non les variables $_FILES['avatar']... il y a un problème. Un fichier uploadé en PHP ne figure d'aucune manière dans le tableau $_POST mais uniquement par $_FILES dès lors que la balise form possède l'attribut enctype de telle sorte que sa valeur soit multipart/form-data
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2007, 17h15   #12
Membre du Club
 
William RICHARD
Inscription : septembre 2007
Messages : 156
Détails du profil
Informations personnelles :
Nom : William RICHARD
Âge : 30
Localisation : France, Aube (Champagne Ardenne)

Informations forums :
Inscription : septembre 2007
Messages : 156
Points : 68
Points : 68
et pourtant tel est bien le cas!
j'ai remodifier le script avec 2 var_dump
un pour $_POST et un pour $_FILES
j'obtien un array(1) avec une chaine contenant le nom
de mon image pour le premier et un array(0) pour le second.
dans ma balise form y a method="post",pour moi c'est normal
mais je débute, ce serai pas ça le problem?



warwill,
spécialité...heu...les trucs cheloud!!
warwill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2007, 11h38   #13
Membre du Club
 
William RICHARD
Inscription : septembre 2007
Messages : 156
Détails du profil
Informations personnelles :
Nom : William RICHARD
Âge : 30
Localisation : France, Aube (Champagne Ardenne)

Informations forums :
Inscription : septembre 2007
Messages : 156
Points : 68
Points : 68
probleme résolut!!
un petit / à la fin de mon chemin en plus,
j'ai déplacer le chmod et je l'ai changer en 755( au lieu de 0755).
et 2 ou 3 testes plus loin ça marche.
merci à tous.
warwill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 11h43   #14
Membre du Club
 
William RICHARD
Inscription : septembre 2007
Messages : 156
Détails du profil
Informations personnelles :
Nom : William RICHARD
Âge : 30
Localisation : France, Aube (Champagne Ardenne)

Informations forums :
Inscription : septembre 2007
Messages : 156
Points : 68
Points : 68
Encore et toujours de probleme d'upload!
la même mais sur server!
même page, même script, et rien n'est uploader.
par contre je suis pas sur du chemin.j'aimerais
utiliser la méthode absolu(si je me trompe pas!!).
mon site est dans un dossier /web, et dans ce dossier
j'ai un /photo dans lequel je veux uploader les images.
j'ai laissé tout les messages de vérification dans le script mais
il n'affiche rien comme si tout passait, alors que l'upload n'est pas
fait.
je ne désespère plus j'ai dépassé ce stade...
warwill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 13h45   #15
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Vous devez vous assurer que le chemin utilisé est correct. Pour cela, vous pouvez vous baser sur les fonctions realpath/getcwd (obtenir le chemin absolu du répertoire courant) ou encore éventuellement sur la variable $_SERVER['DOCUMENT_ROOT'] (qui devrait indiquer la racine de votre site).

Vous devez également donner les droits d'écriture au serveur web sur le répertoire accueillant ces fichiers uploadés.

Faites également des tests simples : assurez-vous que vos fichiers respectent les types que vous avez indiqués et surtout qu'ils soient de taille tout à fait respectable (suivant configuration de PHP et celles que vous avez implantées).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 09h58   #16
Membre du Club
 
William RICHARD
Inscription : septembre 2007
Messages : 156
Détails du profil
Informations personnelles :
Nom : William RICHARD
Âge : 30
Localisation : France, Aube (Champagne Ardenne)

Informations forums :
Inscription : septembre 2007
Messages : 156
Points : 68
Points : 68
merci pour cette fonction (getcwd) qui m'a permit de tout résoudre.
c'était juste un probleme de chemin, comme je le présentais.
Encore merci à tous pour tout ce que vous faites ici.
warwill est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h22.


 
 
 
 
Partenaires

Hébergement Web