IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

upload de fichiers, accents, utf-8


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut upload de fichiers, accents, utf-8
    Bonjour,
    Je suis en train de développer un site en UTF-8 (pour être compatible ajax).
    j'ai fait un petit script php pour uploader des fichiers à partir d'un formulaire html. Dans mon fichier php, je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $tmpfilename = $_FILES['fichier']['tmp_name'];
    $filename    = $_FILES['fichier']['name'];
    if ( !is_uploaded_file($tmpfilename) )
        die("Erreur lors de l'upload: fichier introuvable (".$tmpfilename.")");
    mon code html ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    ...
    <form enctype="multipart/form-data" action="upload.php" method="post">
        <input type="hidden" name="MAX_FILE_SIZE" value="100000">
        <input type="file" name="fichier" size="30">
    </form>
    Lorsque j'upload un fichier sans caractères spéciaux, ça fonctionne très bien.
    Lorsque j'upload un fichier avec caractères spéciaux, ça le fonctionne pas. J'obtiens alors par exemple :

    $tmpfilename == "" (chaine vide)
    $filename == "élément.jpg"
    is_uploaded_file() retourne "false"

    Je ne sais vraiment pas comment m'en sortir. Je me doute qu'il s'agit d'un problème d'encodage, mais je ne sais pas quoi changer et où... j'ai essayé d'ajouter accept_charset="utf-8" et accept_charset="iso-8815-1". Mais ça ne fonctionne pas mieux.

    Merci pour vos idées, suggestions, solution...
    Glipper

  2. #2
    Membre chevronné Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Points : 1 895
    Points
    1 895
    Par défaut
    quelque soit le nom du fichier, PHP créer un fichier temporaire dans le genre "phpABCD" que tu peux retrouver dans "tmp_name"
    donc le problème n'est pas du coté de PHP

    tu as dis que le formulaire est envoyé avec AJAX donc le formulaire que tu nous a montré n'est pas utilisé ?
    GNAP !

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Fait un tu as peut etre une erreur
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par nosferapti Voir le message
    quelque soit le nom du fichier, PHP créer un fichier temporaire dans le genre "phpABCD" que tu peux retrouver dans "tmp_name"
    donc le problème n'est pas du coté de PHP

    tu as dis que le formulaire est envoyé avec AJAX donc le formulaire que tu nous a montré n'est pas utilisé ?
    en fait, j'utilise un plugin jQuery pour envoyer le formulaire en ajax (c'est du code javascript non intrusif) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var options = { 
         success:       showResponse  // post-submit callback 
    }; 
    jQuery('#ma_form').ajaxForm(options);
    Le formulaire est alors envoyé en ajax. En utilisant l'outil Firebug, je peux voir la requête http qui sort :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Content-Type: multipart/form-data; boundary=---------------------------6440166221291
    Content-Length: 129628
     
    -----------------------------6440166221291
    Content-Disposition: form-data; name="MAX_FILE_SIZE"
     
    100000
     
    -----------------------------6440166221291
    Content-Disposition: form-data; name="fichier[]"; filename="bannière.png"
    Content-Type: image/png
    ...
    Si je met accept-charset="ISO-8859-1" comme attribut dans la balise <form> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Content-Type: multipart/form-data; boundary=---------------------------55112238324653
    Content-Length: 129633
     
    -----------------------------55112238324653
    Content-Disposition: form-data; name="MAX_FILE_SIZE"
     
    100000
    -----------------------------55112238324653
    Content-Disposition: form-data; name="fichier[]"; filename="bannière.png"
    Content-Type: image/png
    ...
    Dans les deux cas, ça ne fonctionne pas, $_FILES['fichier']['tmp_name'] est une chaine vide.

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Fait un tu as peut etre une erreur
    Ah en effet, j'ai une erreur 2 :

    UPLOAD_ERR_FORM_SIZE
    Value: 2; The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.

    Le champ <input type="hidden" name="MAX_FILE_SIZE" value="100000"> limite la taille à un peu moins de 100ko (mon fichier fait 124ko). Je pensais que 100 000 était une valeur élevée mais en fait c'est pas énorme.

    Bon et bien en fait, la solution n'était pas du tout un problème d'encodage comme je le pensais. Quand on se focalise sur qqchose, on oublie de regarder le reste...

    Merci pour votre aide

    Glipper

  6. #6
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,
    Avec fichier[], tu envoies un tableau,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach ($_FILES["fichier"]["tmp_name"] as $key => $tmpfilename) {
           $filename = $_FILES["fichier"]["name"][$key];
            if ( !is_uploaded_file($tmpfilename) )
        die("Erreur lors de l'upload: fichier introuvable (".$tmpfilename.")");
    }

Discussions similaires

  1. [PHP 5.2] Problème upload de fichier avec accent et firefox
    Par dedesite dans le forum Langage
    Réponses: 6
    Dernier message: 15/06/2011, 12h15
  2. [FTP] Problème pour uploader un fichier
    Par Crazyblinkgirl dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 07/01/2008, 22h21
  3. upload de fichier
    Par 120 dans le forum ASP
    Réponses: 16
    Dernier message: 21/06/2004, 12h07
  4. Upload de fichiers sur un ftp
    Par Crazyblinkgirl dans le forum ASP
    Réponses: 10
    Dernier message: 20/06/2004, 11h55
  5. Upload de fichiers
    Par GDVL dans le forum ASP
    Réponses: 4
    Dernier message: 03/06/2004, 12h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo