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 :

Forcer téléchargement boite de dialogue


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 36
    Points : 16
    Points
    16
    Par défaut Forcer téléchargement boite de dialogue
    Bonjour,
    je voudrais pouvoir forcer le téléchargement quelque soit le type de fichier à télécharger en PHP. J'ai pour cela utilisé la méthode que j'ai pu trouver sur le site.
    J'ai essayé avec plusieurs méthodes pour donner l'adresse du fichier

    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
     
    $full_path = $local; // chemin système (local) vers le fichier
    $file_name = basename($full_path);
    ini_set('zlib.output_compression', 0);
    $date = gmdate(DATE_RFC1123);
    header('Pragma: public');
    header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
    header('Content-Tranfer-Encoding: none');
    header('Content-Length: '.filesize($full_path));
    header('Content-MD5: '.base64_encode(md5_file($full_path)));
    header('Content-Type: application/octetstream; name="'.$file_name.'"');
    header('Content-Disposition: attachment; filename="'.$file_name.'"');
    header('Date: '.$date);
    header('Expires: '.gmdate(DATE_RFC1123, time()+1));
    header('Last-Modified: '.gmdate(DATE_RFC1123, filemtime($full_path)));
    readfile($full_path);
    exit;
    voici les 2 manières de donner l'adresse du fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $local = $_SERVER['DOCUMENT_ROOT'] . "/GestionServeur/temp/".$this->name;
    $local = '../temp/' .$this->name;
    Dans le premier cas : J'ai utilisé le chemin complet du fichier (je travail en local sur un répertoire situé à C:/wamp/www/GestionServeur

    Dans le deuxième cas : j'ai utilisé un chemin relatif

    Le fichier est ouvert sans proposition de le télécharger via la boite de dialogue.

    $this->name représente le nom du fichier et son extension. Le fichier à télécharger est dans le dossier '/www/temp/'.

    merci de votre aide.

  2. #2
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    salut,
    as tu jetter un oeil à la faq ? Comment forcer le téléchargement d'un fichier ?
    Développeur | Zend Certified Engineer

    Étapes Pour mieux se servir du forum:
    1. Commencez par lire les cours et tutoriels ;
    2. Faites une recherche;
    3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles;

    Nix>_Rien n'est plus pratique que la théorie

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    Bonjour Thes32..
    Je ne pense pas que mon post a été lu. Il arrive effectivement que les personnes regarde la FAQ avant de poster et consulte les forums. En effet le code de mon dernier post a été réalisé via la FAQ. Je ne comprends donc pas ta réponse

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 273
    Points
    273
    Par défaut
    Qu'est ce que tu veux dire par "Le fichier est ouvert sans proposition de le télécharger via la boite de dialogue." Est tu sûr que le problème se situe à cette endroit ??


    Patouche

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    Bonjour,
    je veux dire par la que le fichier est interprété par le navigateur (il est directement ouvert dans le navigateur). Aucune boite de dialogue n'est proposée.

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 273
    Points
    273
    Par défaut
    Si on reprend ton code, sur mon script de DL (je l'avais aussi pris ici) j'ai

    Pragma: no-cache
    Cache-Control: no-cache, must-revalidate
    Expires :0
    et j'ai aussi Content-Type: application/force-download

    Par contre, je n'ai définie ni Date, ni Last-Modified, ni le Md5.... Enfin, je sais pas, je l'avais un peu bidouiller à ma sauce (qui est peut être indigeste... ça je sais pas )


    Patouche

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    J'ai essayé en utilisant tes headers mais sans succès, toujours le même problème

  8. #8
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    Comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    header('Content-Type: application/octet-stream');
    header('Content-Transfer-Encoding: binary');

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    Bonjour erica,
    je viens d'essayer ta solution avec tes headers sans succès. Apparemment le problème ne viendrait pas de la.


    voici la méthode de ma classe Fichier :
    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
     
    function download($uneAdresse,$unLogin,$unPass,$path){
    	if($unFlux = ftp_connect($uneAdresse)) {
    		if (ftp_login($unFlux, $unLogin, $unPass)){
    			$path = $path .$this->name;
    			$local = '../temp/' .$this->name; //répertoire sur le serveur ou le fichier est téléchargé
    			if(ftp_get($unFlux,$local,$path,FTP_BINARY)){
                                   $full_path = $local; // chemin système (local) vers le fichier
    				header('Content-Type: application/octet-stream');
    				header('Content-Transfer-Encoding: binary');
    				readfile($full_path);
     
    				echo '<img src="../img/true.png"></img>Le fichier ' .$this->name .' a &eacute;t&eacute; t&eacute;l&eacute;charg&eacute; vers ' .$local;
    				}
    				else{
    					echo '<img src="../img/false.png"></img>Le fichier ' .$this->name .' n&rsquo;a pas &eacute;t&eacute; t&eacute;l&eacute;charg&eacute; vers ' .$local;
    				}
    			}
    		}
    	}
    Pour le fonctionnement: une fonction java script est lancée lors du clic sur le bouton télécharger correspondant au fichier à télécharger. la fonction de manière asynchrone grâce à Ajax va appeler un script php qui va appeler cette méthode de la classe Fichier ( méthode ci-dessus).

    Je peux voir que la réponse du script php exécuté via ajax est le fichier interprété par le navigateur. Je voudrais qu'il s'agisse de la boite de dialogue pour permettre le téléchargement du fichier.

    Peut être voyez vous mieux d'où le problème peu venir?

  10. #10
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 273
    Points
    273
    Par défaut
    oui, mais ce que tu fais, c'est tenté de lire un fichier auquel tu n'as pas accès. readfile n'as juste pas les accès à ton fichier/

    Ce que tu devrais faire c'est plus un readfile ( $local );


    Patouche

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    Bonjour,
    je ne comprends pas trop.. Je télécharge un fichier depuis un serveur ftp vers mon serveur dans un fichier 'temp'. Puis je fais un readfile sur ce fichier. Le fichier en question est donc bien situé en local.
    Je dois bien avoir un accès total au fichier vu que celui -ci vient d'être téléchargé en local. Je fais ensuite le readfile sur ce fichier.

    ps: j'ai une ligne ou $fullpath prend la valeur de $local donc readfile($fullpath) fais bien son action sur le fichier en local.

    je n'ai peut être pas compris de quoi tu parlais ( merci de t'intéresser à mon problème).

  12. #12
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 273
    Points
    273
    Par défaut
    C'est moi qui dit des bêtises... j'avais pas vu ta ligne.

    Lorsque tu regardes ta réponse dans ton fichier, quelle sont les entetes ?? utilises firebug, dragonfly ou un autre plugin qui te permet de déterminer les entêtes retourner.

    Le fait que cela soit de l'ajax ne devrait pas poser de problème normalement mais normalement juste du JS devrait suffire....



    Patouche

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    Voici l'en tête de la réponse :

    Date: Sun, 18 Jul 2010 18:19:11 GMT
    Server: Apache/2.2.6 (Win32) PHP/5.2.5
    X-Powered-By: PHP/5.2.5
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Content-Transfer-Encoding: binary
    Keep-Alive: timeout=5, max=100
    Connection: Keep-Alive
    Transfer-Encoding: chunked
    Content-Type: application/octet-stream

  14. #14
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 273
    Points
    273
    Par défaut
    Bizarre ...

    Et si tu tapes directemtn dans ton navigateur l'url de ta requete, il te propose une boite de dialogue (sans passer par JS en fait) ?

    Avant de rajouter le JS, il faut qu'il te propose à cet endroit une boite de dialogue.


    Patouche.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    euh je vois pas trop comment faire :

    -j'ai déjà du changer les POST en GET pour que mon script php puisse marcher car avec l'ajax je passais les arguments en POST

    -j'ai besoin de récupérer ma variable de session $_SESSION['utilisateur'] pour pouvoir la mettre en paramètre et que mon script php puisse marche , comment puis je faire ?

  16. #16
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 273
    Points
    273
    Par défaut
    Si tes variables sont en passer par l'url, c'est beaucoup plus simple.

    Test en rentrant dans ton navigateur ton url avec les variables get que tu souhaites. Pour la session, ne t'en occupes pas pour le moment, tu définies tes variables de sortes à se que tu n'es pas d'erreur dans un premier temps. Normalement récupérer des variables de session ne devrait pas poser de problème.

    Donc si ta requete ajax tu la fait à l'url http://www.ton.site.fr/download.php?id=15, alors tu passes cette url directement dans ton navigateur.


    Patouche

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    Bonjour,
    je ne comprends pas trop sans le JavaScript en tapant l'URL ci dessous j'ai bien une boite de dialogue me proposant de télécharger mais il s'agit du fichier 'download.php' et non du fichier fffdfg.txt que je souhaite télécharger.

    voici l'url
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://localhost/GestionServeur/php/download.php?idserveur=8&name=fffdfg.txt
    et voici le fichier 'download.php'
    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
    <?php
    	//On importe les fichiers nécessaires
    	include "insertclass.php";
    	//On démarre une session
    	session_start();
     
    	//On récupère l'utilisateur + vérification droit accès
    	if(isset($_SESSION['utilisateur'])){
    		$unUtilisateur = $_SESSION['utilisateur'];
    	}
    	else{
    		//la personne n'a pas accès à cette page
    		//rediretion vers la page des fichiers
    		header("refresh:0; url='voirfichier.php'");
    	}
     
    	if(isset($_GET['name'])){
    		if(isset($_GET['idserveur'])){
    			$Id = $_GET['idserveur'];
    			$name = $_GET['name'];
    			$i = 0;
    			$trouveServeur == FALSE;
    			while ($i < count($unUtilisateur->CollectionServeur)) {
    				$unServeur = $unUtilisateur->CollectionServeur[$i];
    				$unId = $unServeur->id;
    				if($unId == $Id){
    					$trouveServeur = TRUE;
    					break;
    				}
    				$i = $i + 1;
    			}
     
    			if($trouveServeur == TRUE){ // si le serveur connecté a été trouvé
    				$i=0;
    				while ($i < count($unServeur->CollectionFichier)) {
    					$unFichier = $unServeur->CollectionFichier[$i];
    					$unNom = $unFichier->name;
    					if($unNom == $name){
    						//le fichier est rapatrié du serveur ftp vers le serveur						$unFichier->download($unServeur->adresse,$unServeur->login,$unServeur->pass,$unServeur->dir); 
     
     
    						break;
    					}
    					$i = $i + 1;		
    				}
    			}
    		}
    		else{
    		//rediretion vers la page des fichiers
    		header("refresh:0; url='voirfichier.php'");
    		}
    	}		
    	else{
    		//rediretion vers la page des fichiers
    		header("refresh:0; url='voirfichier.php'");
    	}
     
    ?>

  18. #18
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Pour la redirection, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Location: voirfichier.php');

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    merci Erica pour les redirections, apparemment les 2 méthodes arrive au même résultat avec la possibilité de rajouter un temps avec refresh. Mais étant donné que je n'ai pas besoin de temps je vais faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Location: voirfichier.php');
    des idées pour mon problème ?

  20. #20
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    En regardant le code de la fonction download, je vois qu'il n'ya que deux header (Content-Type et Content-Transfer-Encoding).

    Et en ajoutant header('Content-Disposition: attachment; ...); ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(ftp_get($unFlux,$local,$path,FTP_BINARY)){
    	$file_name = basename($full_path);
    	header('Content-Type: application/octet-stream');
    	header('Content-Transfer-Encoding: binary');
    	header('Content-Disposition: attachment; filename="'.$file_name.'"');
    	readfile($full_path);
    Au passage, tu devrais aussi faire la redirection dans le cas où le serveur ne serait pas trouvé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if($trouveServeur == TRUE){ // si le serveur connecté a été trouvé
    	...
    }else
    	header('Location: voirfichier.php');

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/06/2010, 20h57
  2. Réponses: 9
    Dernier message: 14/08/2009, 22h19
  3. Réponses: 5
    Dernier message: 18/05/2009, 19h54
  4. forcer l'affichage d'une boite de dialogue
    Par kitch18 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 05/02/2008, 18h23
  5. Boite de dialogue téléchargement
    Par cjacquel dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 12/08/2007, 23h54

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