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 impossible via un formulaire


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 26
    Points
    26
    Par défaut upload impossible via un formulaire
    Bonjour

    Je tourne en rond depuis hier sur un problème surement stupide, mais qui m'échappe complètement.
    J'essaie d'uploader un fichier via un formulaire, mais ça ne fonctionne pas.

    J'ai utilisé le tutoriel de Antoine Hérault du site développer.com (http://antoine-herault.developpez.co...ls/php/upload/) en le suivant à la lettre.

    J'ai bien enctype="multipart/form-data" dans ma balise form
    Je vérifie que le dossier est bien "écrivaille" avec is_writable qui est true, de toute façon, je l'ai passé en 777.
    Je vérifie aussi l'existence du dossier avec is_dir au cas je le verrais, mais ou ce serait une illusion !. Il existe.

    Je demande d'afficher les erreurs avec $_FILES['fichier']['error'] et je reçois 0 ce qui, d'après ce que j'ai compris, signifie que tout est OK.

    Comme cela ne fonctionnait toujours pas, j'ai regardé du côté de php.ini.
    J'ai vérifié que file_uploads = On, ce qui était le cas, et comme upload_tmp_dir était commenté, je lui ai attribué une valeur = /var/tmp/upload/ après avoir créé le dossier et l'avoir mis en 777. Le site est hébergé dans le dossier /var/www/mondossier/.

    Du coup, je ne sais plus quoi chercher pour régler le problème. Qu'est-ce que je n'ai pas vérifié. J'ai fait mes tests avec de petits fichiers .txt ou .pdf et j'ai mis une valeur de 20M dans la taille max du php.ini.

    Si quelqu'un a une idée… Merci d'avance.

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Déjà, "ça ne fonctionne pas", c'est assez flou comme problème, vu qu'on ne sait pas ce que tu fais de ton fichier une fois uploadé. Tu tentes de l'enregistrer sur le serveur et il ne s’enregistre pas ? Tu tentes de lire et il est vide ?

    Ensuite, nous donner un peu de code pourrait nous aider à t'aider, par exemple le code du formulaire et celui su script qui gère la récupération du fichier.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    Pardon de ce manque de précision.
    J'essai de le déposer dans un dossier (qui existe et qui est 777), mais il ne se dépose pas… le dossier reste vide.

    Est-ce que pour que la fonction move_uploaded_file fonctionne, il faut installer une "librairie" comme il faut le faire avec la librairie GD pour faire des vignettes ?

    Merci pour ton intérêt.

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    A priori, non, move_​uploaded_​file est une fonction native de PHP.
    Peut-on voir le code qui traite l'upload ? (vu ta description, ça doit être une bêtise du genre de celles qu'on ne voit plus quand il s'agit de son propre code)
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    Donc voila le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    $dossier = '../upload/test/';// le fichier qui fait l'upload est dans un dossier à la racine et le dossier upload est à la racine
    // les dossier upload et test sont en 777
     
    if(is_dir($dossier)){
       echo "Le dossier existe<br />";// indique que le dossier existe
    }
    else{
       echo "Le dossier n'existe pas<br />";
    }
    if (is_writable($dossier)) {
        echo 'Le fichier est accessible en écriture.<br />'; // indique que le dossier est accessible en écriture
    }
    else {
        echo 'Le fichier n\'est pas accessible en écriture !<br />';
    }
     
    echo "<p>vardump</p><pre>";
    var_dump($_FILES); // -> donne 0
    echo "</pre><p>fin vardump suivi du print r</p>";
     
    $fichier = basename($_FILES['fichier']['name']);
    $taille_maxi = 100000;
    //$taille_maxi = 500000;
    $taille = filesize($_FILES['fichier']['tmp_name']);
    $extensions = array('.png', '.gif', '.jpg', '.jpeg', '.txt', '.pdf');
    //$extensions = array('.png', '.gif', '.jpg', '.jpeg', '.txt', '.doc', '.docx', '.xls', '.xlsx', '.odt', '.rtf', '.csv', '.pdf');
    $extension = strrchr($_FILES['fichier']['name'], '.'); 
    //Début des vérifications de sécurité...
    //Si l'extension n'est pas dans le tableau
    if(!in_array($extension, $extensions)) { 
    	$erreur = 'Vous devez uploader un fichier de type png, gif, jpg, jpeg, txt ou doc...'; // ai fait des tests avec des extention qui ne sont pas dans la liste -> renvoi le message d'echec, sinon non
    	echo '<p>Echec de l\'upload ! PAS LA BONNE EXTENSION</p>';
    }
    if($taille>$taille_maxi){
         $erreur = 'Le fichier est trop gros...'; // idem pour les test de taille en mettant $taille_maxi très faible
         echo '<p>Echec de l\'upload ! PAS LE BON POIDS</p>';
    }
     //S'il n'y a pas d'erreur, on upload
    if(!isset($erreur)){
    	 $fichier=normalisation($fichier);// fonction qui supprime les accents, espace... et qui fonctionne (je la mets en dessous)
    	 // J'ai aussi fait un test sans l'utiliser et c'est pareil
    	//Si la fonction renvoie TRUE, c'est que ça a fonctionné...
        if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier)) {
        	echo '<p>Upload effectué avec succès !</p>';
         }
    	//Sinon (la fonction renvoie FALSE).
        else {
        	echo '<p>Echec de l\'upload !</p>';
    		echo $_FILES['fichier']['error']."<br />";
    		echo "<p>TEST / ".$_FILES['fichier']['error']['UPLOAD_ERR_INI_SIZE']."</p>";
         }
    }
    else{
         echo $erreur;
    }
     
    // --------------------------------
     
    function normalisation($nompage) {  
    	$accents = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ";
    	$ssaccents = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn";
    	$nompage = strtr($nompage,$accents,$ssaccents);
    	$in = array(' ', '?', '!', ',', ':', "'", '&', '(', ')');
    	$out = array('-', '', '', '', '', '', '-', 'et', '', '');
       	$nompage = str_replace($in, $out, $nompage);
    	echo "<p> ---------- > Normalisation : nom du fichier = ".$nompage."</p>";
       	return $nompage;
    }
    Et ce que la page affiche fonction des "écho" que j'ai mis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    If isset fichier
    Traitement de l'UPLOAD : tmp_name = /tmp/phpFEyPge
    Le fichier existe.
    Le dossier existe
    Le fichier est accessible en écriture.
    vardump
    array(1) {
      ["fichier"]=>
      array(5) {
        ["name"]=>
        string(16) "Sans titreml.txt"
        ["type"]=>
        string(10) "text/plain"
        ["tmp_name"]=>
        string(14) "/tmp/phpFEyPge"
        ["error"]=>
        int(0)
        ["size"]=>
        int(2804)
      }
    }
    fin vardump suivi du print r
    0
    fin du print
    Echec de l'upload !
    0
    Si c'est bien une erreur stupide je me pile !
    Merci pour ton aide

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Je crois que tu as oublié le nom du fichier de destination :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     $fichier=normalisation($fichier);// fonction qui supprime les accents, espace... et qui fonctionne (je la mets en dessous)
    if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier)) {
    devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     $fichier=normalisation($fichier);// fonction qui supprime les accents, espace... et qui fonctionne (je la mets en dessous)
    if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier.$fichier)) {
    non ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    Non, c'est jusque que c'était bien au dessus avec les autres données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (isset($_FILES['fichier'])){
    		$fichier=$_FILES['fichier'];
    }

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    Pardon, pas bien lu… il faut mettre .dossier.$fichier
    J'essaie ça de suite...

  9. #9
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Effectivement, tu récupères bien le nom du fichier. Mais tu ne t'en sers pas.
    Regarde bien la différence entre ta ligne d'upload :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier)) {
    et la mienne :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier.$fichier)) {
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    De toute façon, il y avait une erreur ! et j'y ai cru, mais non, rien ne se dépose.
    J'ai essayé aussi avec juste $fichier au cas ou, mais qu'il y ai $fichier ou $dossier.$fichier rien ne se dépose sur le serveur.

    Je vais tenter de remodifier le php.ini où j'avais décommenté la ligne upload_tmp_dir en la recommençant pour voir si une fois l'erreur que tu as relevée, corrigé ça fonctionne.

    Encore merci pour ont attention et la précision de ton regard !

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    Ce que je n'arrive pas à comprendre c'est pourquoi le message d'erreur est à 0 alors que le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier))
    renvoie bien false… ce qui est effectivement le cas !

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    Bon, désolé pour tout cela… c'est le avatar que j'avais oublié de remplacer par fichier !!!

    Désolé d'avoir monopolisé de ton temps et 1000 merci de l'avoir fait !
    Je sais, c'est pas une excuse, mais je bosse pour m'occuper parce que j'ai un pb de cervical, que j'ai des douleurs qui m'empêche de dormir et que malgré la morphine et tout le reste de ce que j'ingurgite, seul de tenter des choses en code me permets de passer mes longues heures de douleurs !

    J'essaierais de moins faire chier le monde quand je suis trop fatigué !

    Encore merci pour ton aide (je note cette discussion comme excellent pour la qualité et la bienveillance de tes réponses).

    (par contre je ne trouve pas comment on note la discussion comme résolue.
    Encore merci.

  13. #13
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Salut,

    Si tu veux une solution d'upload complète tu peux regarder cette classe ajax/php.

    Elle permet de dépasser les configurations serveur "post_max_size" et "upload_max_filesize" ce qui peut être utile pour les gros fichiers si on a pas la main sur le serveur (mutualisé par exemple). Permet par la même occasion et de manière transparente de faire des sauvegardes temporaires tout au long du téléchargement pour permettre la reprise d'un téléchargement éventuellement interrompu en utilisant la partie sauvegardée.

    En complément de ces aspects techniques elle offre une multitude de possibilités pour configurer le retour des informations en temps réel (barre de progression, temps restant, prévisualisation des images, etc...) en attribuant simplement des classes css sur des éléments html de ton choix sans besoin de modifier le code.

    Une dizaine d'exemples sont disponibles dans le dossier de test. Suffit de déposer le dossier sur le serveur puis de tester.

    Et pour des besoins plus poussés, la classe dispose de fonctions javascript événementielles qui peuvent servir pour une interaction avec des scripts externes. A ce titre je donne deux exemples fonctionnels de crop.

    Voilà j'ai fini ma pub, c'est peut être surdimensionné pour tes besoins, mais c'est pour info (tu n'auras peut-être pas perdu tout ton temps en faisant ta petite erreur )

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    Merci ABCIWEB
    Je regarde ça. Ça m'a effectivement l'air surdimensionner, mais ça doit être très intéressant pour comprendre un peu plus toutes ses interactions entre langages.

  15. #15
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par den66 Voir le message
    Merci ABCIWEB
    Je regarde ça. Ça m'a effectivement l'air surdimensionner, mais ça doit être très intéressant pour comprendre un peu plus toutes ses interactions entre langages.
    C'est surdimensionné dans le sens où il y a beaucoup de possibilités, mais tu n'es pas obligé de toutes les utiliser et pour des petits besoins une ou deux lignes de configuration suffit. C'est quand même beaucoup plus rapide que de développer l'équivalent

    Par contre pour comprendre les interactions, je te conseille plutôt un tuto spécifique sur le sujet qui t'intéresse car le mode d'emploi concerne l'utilisation et la configuration de la classe et non pas le fonctionnement du code javascript lui-même. Enfin tu peux toujours regarder puisque le code de développement est fourni mais c'est un "gros morceau" qui fait appel à des connaissances assez variées donc difficile de l'utiliser comme un tuto.

    C'est un outil prêt à l'emploi hautement configurable qui fait gagner beaucoup de temps si l'on souhaite utiliser les fonctionnalités disponibles, mais utiliser le code source comme tuto serait un peu hard (il n'a pas été prévu pour ça)

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    Bonjour
    Et merci pour cet avis.
    J'ai fini par mettre en place mon petit code de téléchargement qui effectivement, avec la vérification de l'existence du dossier et des droits d'écriture, ne prend que quelques lignes.
    Je m'aperçois aussi que la programmation n'est pas simplement l'apprentissage d'un langage, mais aussi d'un mode de pensée et de tout un travail en amont de l'utilisation du dit langage (et de ceux que l'on utilise aussi autour).
    Ce qu'il y a de difficile (outre ces apprentissages), c'est de savoir aussi ce que l'on peut utiliser sans avoir à "réinventer la roue" comme le disent certains.
    En tout cas, merci à toi et à Célira pour votre aide et vos avis très constructifs.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.0] Upload de fichier via un formulaire ayant plusieurs fieldsets
    Par nina.b dans le forum Langage
    Réponses: 8
    Dernier message: 11/09/2009, 12h10
  2. Erreur upload fichier via formulaire
    Par Telecaster dans le forum Langage
    Réponses: 2
    Dernier message: 05/02/2009, 11h30
  3. Réponses: 4
    Dernier message: 22/02/2008, 12h43
  4. Réponses: 4
    Dernier message: 29/11/2007, 13h09
  5. [Web] Upload fichier via formulaire HTTP
    Par nik00s dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 11/08/2005, 12h27

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