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 13/03/2007, 22h28   #1
Invité de passage
 
Étudiant
Inscription : mars 2007
Messages : 4
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2007
Messages : 4
Points : 1
Points : 1
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 :
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 :
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 :
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 :
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 !
ManOnDaMoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2007, 23h49   #2
Membre chevronné
 
Avatar de |PaRa-BoL
 
Inscription : novembre 2003
Messages : 737
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : novembre 2003
Messages : 737
Points : 782
Points : 782
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.
__________________
http://www.ape-project.org/
|PaRa-BoL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2007, 19h01   #3
Invité de passage
 
Étudiant
Inscription : mars 2007
Messages : 4
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2007
Messages : 4
Points : 1
Points : 1
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
ManOnDaMoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2007, 19h16   #4
Membre chevronné
 
Avatar de |PaRa-BoL
 
Inscription : novembre 2003
Messages : 737
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : novembre 2003
Messages : 737
Points : 782
Points : 782
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 ?
__________________
http://www.ape-project.org/
|PaRa-BoL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2007, 14h19   #5
Invité de passage
 
Étudiant
Inscription : mars 2007
Messages : 4
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2007
Messages : 4
Points : 1
Points : 1
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 :
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.
ManOnDaMoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2007, 16h40   #6
Membre chevronné
 
Avatar de |PaRa-BoL
 
Inscription : novembre 2003
Messages : 737
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : novembre 2003
Messages : 737
Points : 782
Points : 782
Fait quand même gaffe, la taille limite des sessions est souvent limitée
__________________
http://www.ape-project.org/
|PaRa-BoL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2007, 17h54   #7
Invité de passage
 
Étudiant
Inscription : mars 2007
Messages : 4
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2007
Messages : 4
Points : 1
Points : 1
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 :
<INPUT type=hidden name=MAX_FILE_SIZE  VALUE=LABONNETAILLE>
Merci
ManOnDaMoon 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 09h20.


 
 
 
 
Partenaires

Hébergement Web