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] Utilisation, sauvegarde, suppression d'un fichier uploadé


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [Upload] Utilisation, sauvegarde, suppression d'un fichier uploadé
    Bonjour

    Je suis tombé sur un casse tête qui n'en est peut-être pas un, et j'aimerais vos lumières.

    Je débute en PHP (plus ou moins) et je code en ce moment un script qui me permet de formater le contenu d'un fichier XML grâce à XSLT avec PHP4.

    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
    <?php 
    $nomfichier = "test.xml";
     
    if(isset($_GET['page'])) {
            $p = $_GET['page'];
      }
      else {
            $p = 'main';
      }
     
    $file = fopen($nomfichier,"r");
    $xml = fread($file,filesize($nomfichier));
    fclose($file);
     
    switch($p)
    {
     case 'liste': 
     include('content/liste.php');
     break;
     case 'message':
     include('content/message.php');
     break;
     
     default:
     include('content/main.php');
     break;
    }
     
    ?>
    Jusqu'ici rien de compliqué, tout fonctionne avec un fichier enregistré en dur sur le serveur. Je donne simplement le nom du fichier à mon script, qui le recharge à chaque requette :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $nomfichier = "test.xml";
     
    $file = fopen($nomfichier,"r");
    $xml = fread($file,filesize($nomfichier));
    fclose($file);

    Mais voilà : le projet prévoit qu'un utilisateur sélectionne son fichier local et l'envoie au serveur distant pour que celui-ci l'utilise.

    Pour ce faire, j'uploade le fichier via un formulaire.
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <form method="post" enctype="multipart/form-data" action="?page=liste">
          <p>
    	<input type="file" name="fichier" size="30">
    	<input type="submit" name="upload" value="Uploader">
          </p>
    </form>

    Et je récupère le fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if( isset($_POST['upload']) ) // si formulaire soumis
    {
        $nomxml = $_FILES['fichier']['tmp_name'];
        /* Pleins de tests de sécurité (verif extension, toussa...) */
        $file=fopen($nomxml,"r");
        $xml=fread($file,filesize($nomxml));
        fclose($file);
    }
    J'ai bien le contenu de mon fichier dans la variable $xml, j'affiche bien ma page 'liste' que je charge tout de suite après l'upload, mais je perds bien évidememnt tout ça dès que je passe sur une autre page via le switch.
    Il faut que je trouve un moyen de le conserver... Mais comment ?

    J'ai pensé enregistrer le fichier sur le serveur après upload grâce à move_uploaded_file(). Mais :
    - Plusieurs utilisateurs peuvent accéder au script en même temps. Donc je ne peux pas sauvegarder le fichier sous un nom fixe.
    - Plusieurs utilisateurs peuvent (cas exceptionnel, mais tout de même...) envoyer le même fichier en même temps. Donc je ne peux pas le sauvegarder sous son nom initial.
    - Le fichier est "sensible" car personnel. Il doit être supprimé.

    Bref ça m'a l'air très compliqué.

    N'y a-t-il pas une méthode qui me permettrait de lire le fichier une fois et une seule pour le conserver jusqu'à ce que l'utilisateur ait quitté le script ? (j'en doute fort, mais qui ne tente rien n'a rien... )

    Ou sinon, quelle serait la bonne méthode pour sauvegarder mon fichier (et si possible le supprimer après utilisation...) dans un dossier 'xml/' par exemple ?


    Si ça manque de précision, dites le moi ¬_¬ Mais sur le moment, je ne vois pas trop quoi rajouter...


    Merci d'avance !

  2. #2
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    Tu peut stocker le fichier sous un nom impossible à trouver (chaîne MD5) ou alors le stocker dans les sessions mais ca serai bien lourd !

    Sinon MySQL propose un type de champ "blob" qui permet de stocker des données binaire dans la base de donnée.

  3. #3
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par |PaRa-BoL
    Tu peut stocker le fichier sous un nom impossible à trouver (chaîne MD5) ou alors le stocker dans les sessions mais ca serai bien lourd !

    Sinon MySQL propose un type de champ "blob" qui permet de stocker des données binaire dans la base de donnée.
    Merci pour la réponse rapide

    Je n'utilise pour l'instant pas de table MySQL dans le projet et j'aurais aimé m'en passer...
    Et effectivement, le MD5 risque d'être trop gourmand.

    N'y a-t-il pas un moyen pour repasser le fichier ou le contenu du fichier par la méthode POST, en passant par le fichier temporaire ? :

    Fichier local -> Fichier temporaire sur le serveur -> Nouveau fichier temporaire à chaque chargement...


    Merci encore

  4. #4
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    Tu peut gérer toi meme les temporaires

    /mes_tmp/uniqid.tmp -> Stock le nom dans une sessions
    Et quand ta plus besoin tu "unlink".

    Ps : Pourquoi trop lourd MD5 ?

  5. #5
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    J'ai finalement résolu mon problème après avoir découvert les sessions en PHP.

    je stocke simplement le contenu du fichier dans une variable de session $_SESSION['text'] que je peux ainsi récupérer dans n'importe quelle page tant que l'utilisateur ne s'est pas déconnecté ou n'a pas fermé son navigateur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    session_start();
    $nomxml = $_FILES['fichier']['tmp_name'];
     
    $file=fopen($nomxml,"r");
    $_SESSION['text']=fread($file,filesize($nomxml));
    fclose($file);
    J'ai juste eu à changer ma gestion des erreurs et ajouter une page de delog où placer un appel à session_destroy(). Rien de bien méchant donc...

    Voilà, merci encore pour l'aide.

  6. #6
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    Fait quand même gaffe, la taille limite des sessions est souvent limitée

  7. #7
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par |PaRa-BoL
    Fait quand même gaffe, la taille limite des sessions est souvent limitée
    Tu parles d'une taille globale, ou d'une taille par session ? Tu la connaîtrais ?

    J'ai trouvé ici : http://www.developpez.net/forums/sho...d.php?t=245337
    que la limite de taille globale était "à priori, purement physique".

    Si c'est une limite par session, les fichiers que je passe pèsent au maximum 500 ou 600 kilo octets, mais en moyenne plutôt 10 ou 20. C'est avec les premiers cas, extrêmes, que j'ai testé mon code, et ça passe (pour le moment).

    Mais si il y a une limite, je peux toujours préciser la taille maximum à uploader en rajoutant la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <INPUT type=hidden name=MAX_FILE_SIZE  VALUE=LABONNETAILLE>
    Merci

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

Discussions similaires

  1. [Upload] Récupérer le nom d'un fichier uploadé
    Par will97 dans le forum Langage
    Réponses: 4
    Dernier message: 15/10/2007, 01h59
  2. [Upload] débutant, récupérer nom d'un fichier uploadé
    Par psgman113 dans le forum Langage
    Réponses: 1
    Dernier message: 08/05/2007, 17h24
  3. [Upload] Suppression auto des fichiers uploadés
    Par silver.spike dans le forum Langage
    Réponses: 5
    Dernier message: 09/03/2007, 11h27
  4. [Upload] problème de permission d'un fichier uploadé
    Par ned-flanders dans le forum Langage
    Réponses: 1
    Dernier message: 07/03/2007, 19h30
  5. Réponses: 2
    Dernier message: 30/11/2006, 06h32

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