Redirection après un "enregistrer sous..." en PHP ?

Redirection après un "enregistrer sous..." en PHP ? - PHP - Programmation

Marsh Posté le 24-07-2006 à 09:28:54    

Bonjour, :jap:  
 
J'ai créé un script qui permet de générer un fichier Excel à partir de ma base de données... et je souhaiterai dans la foulée proposer d'enregistrer le fichier sur le poste client.
 
Je n'ai pas réussi à réaliser ceci proprement à savoir :
Ma page listing.php -> liste les membres contenus dans ma base, un lien "générer au format Excel" permet de générer le fichier Excel sur le serveur.
Si je clique dessus, ce lien est remplacé sur la page par "Enregistrer le fichier générer". Il faut alors cliquer dessus pour enregistrer le fichier sous...
 
Mais comble du comble, je n'arrive pas à reloader ma page en l'état d'origine !
Pour enregistrer mon fichier, je passe par des header("blablabla" )  ;)  

Citation :

if (isset($_SESSION["dlfilename"]) && $_SESSION["dlfilename"]!="" )
{
    $filename = $_SESSION["dlfilename"];    
    header("Pragma: public" );
    header("Expires: 0" );
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0" );
    header("Cache-Control: private",false);
    header("Content-Type: application/force-download" );
    header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
    header("Content-Transfer-Encoding: binary" );
    header("Content-Length: ".@filesize($filename));
    set_time_limit(0);
    @readfile("$filename" ) or die("File not found." );
     
    unset($_SESSION["dlfilename"]);
 
    // ------------------------------------------
    // Est il possible de faire une redirection ici ???
    // ------------------------------------------
 
}


 
Je souhaiterai avoir votre expertise pour que lors du click sur "générer au format Excel" je puisse Enregistrer sous... directement !!!
 
Merci d'avance. :)


Message édité par jordel le 24-07-2006 à 11:39:09
Reply

Marsh Posté le 24-07-2006 à 09:28:54   

Reply

Marsh Posté le 24-07-2006 à 11:05:57    

a la place de  
@readfile("$filename" ) or die("File not found." );  
 
tu mets ta generation de fichier  
 
comme ca pas besoin de passer par un fichier temporaire : tu peux telecharfger les données tout de suite

Reply

Marsh Posté le 24-07-2006 à 11:38:18    

Bonjour et merci pour ta réponse,
 
Donc... je fais appelle directement à ma fonction de création du fichier Excel ?
 
Mais comment va t il se télécharger directement sur le poste client ??

Reply

Marsh Posté le 24-07-2006 à 11:43:31    

tu cree une page "genererExcel.php" qui contient :  

Code :
  1. <?
  2.   $filename = $_SESSION["dlfilename"];   
  3.      generation_du_fichier_excel($filename);
  4.     header("Pragma: public" );
  5.     header("Expires: 0" );
  6.     header("Cache-Control: must-revalidate, post-check=0, pre-check=0" );
  7.     header("Cache-Control: private",false);
  8.     header("Content-Type: application/force-download" );
  9.     header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
  10.     header("Content-Transfer-Encoding: binary" );
  11.     header("Content-Length: ".@filesize($filename));
  12.     @readfile("$filename" ) or die("File not found." );
  13.    
  14.     unset($_SESSION["dlfilename"]);
  15. ?>


 
et tu utilise un lien du genre :
< href="./genereFichierExl.php"> cliquez ici pour enregistrer le fichier excel</a>
 
tu utilise quoi pour generer le fichier excel ? parceque tu peux peut etre te passer de l'etape 'ecriture sur le disque'


Message édité par flo850 le 24-07-2006 à 11:43:45
Reply

Marsh Posté le 24-07-2006 à 11:50:48    

Sinon il reste toujours la solution du :
header("Refresh: XX; URL=fichierExcel.xls" );

Reply

Marsh Posté le 24-07-2006 à 11:54:41    

Merci encore... :)
 
Pour générer le fichier Excel, j'utilise une fonction assez barbare que j'ai trouvé sur le net...

Code :
  1. /* *******************************************
  2.             FONCTION save_to_excel2
  3. ******************************************** */
  4. function save_to_excel2($sql_excel,$strPath)
  5. {
  6. $db_link = mysql_connect(DB_SERVER,DB_SERVER_USERNAME,DB_SERVER_PASSWORD) or die("Connexion impossible" );
  7. $requete_excel=mysql_db_query(DB_DATABASE,$sql_excel,$db_link) or die('Erreur SQL : requete_excel !<br>'.mysql_error());
  8. //starting excel
  9. $excel = new COM("excel.application" ) or die("Unable to instanciate excel" );
  10. //print "Loaded excel, version {$excel->Version}\n";
  11. //bring it to front
  12. #$excel->Visible = 1;//NOT
  13. //dont want alerts ... run silent
  14. $excel->DisplayAlerts = 0;
  15. //create a new workbook
  16. $wkb = $excel->Workbooks->Add();
  17. //select the default sheet
  18. $sheet=$wkb->Worksheets(1);
  19. //make it the active sheet
  20. $sheet->activate;
  21. $row=1;
  22. $col=1;
  23. $sheet->activate;
  24. $cell=$sheet->Cells($row,$col);
  25. $cell->Activate;
  26. $cell->value = 'ColA';
  27. $col++;
  28. $cell=$sheet->Cells($row,$col);
  29. $cell->Activate;
  30. $cell->value = 'ColB';
  31. $col++;
  32. $cell=$sheet->Cells($row,$col);
  33. $cell->Activate;
  34. $cell->value = 'ColC';
  35. $col++;
  36. $cell=$sheet->Cells($row,$col);
  37. $cell->Activate;
  38. $cell->value = 'ColD';
  39. $col++;
  40. $cell=$sheet->Cells($row,$col);
  41. $cell->Activate;
  42. $cell->value = 'ColE';
  43. $col++;
  44. $cell=$sheet->Cells($row,$col);
  45. $cell->Activate;
  46. $cell->value = 'ColF';
  47. $col++;
  48. $cell=$sheet->Cells($row,$col);
  49. $cell->Activate;
  50. $cell->value = 'ColG';
  51. $col++;
  52. $cell=$sheet->Cells($row,$col);
  53. $cell->Activate;
  54. $cell->value = 'ColH';
  55. $row++;
  56. while ($ligne_excel=mysql_fetch_object($requete_excel))
  57. {
  58.     $identite=$ligne_excel->nom;
  59.     $adresse=$ligne_excel->adresse;
  60.     $phone=$ligne_excel->telephone;
  61.     $email=$ligne_excel->courriel;
  62.     $login=$ligne_excel->identifiant;
  63.     $balance=$ligne_excel->credit;
  64.     $id=$ligne_excel->numero_id;
  65.     $activation=$ligne_excel->date_activ;
  66.     $col=1;
  67.     $cell=$sheet->Cells($row,$col);
  68.     $cell->Activate;
  69.     $cell->value = $identite;
  70.     $col++;
  71.     $cell=$sheet->Cells($row,$col);
  72.     $cell->Activate;
  73.     $cell->value = $adresse;
  74.     $col++;
  75.     $cell=$sheet->Cells($row,$col);
  76.     $cell->Activate;
  77.     $cell->value = $phone;
  78.     $col++;
  79.     $cell=$sheet->Cells($row,$col);
  80.     $cell->Activate;
  81.     $cell->value = $email;
  82.     $col++;
  83.     $cell=$sheet->Cells($row,$col);
  84.     $cell->Activate;
  85.     $cell->value = $login;
  86.     $col++;
  87.     $cell=$sheet->Cells($row,$col);
  88.     $cell->Activate;
  89.     $cell->value = $id;
  90.     $col++;
  91.     $cell=$sheet->Cells($row,$col);
  92.     $cell->Activate;
  93.     $cell->value = $balance;
  94.     $col++;
  95.     $cell=$sheet->Cells($row,$col);
  96.     $cell->Activate;
  97.     $cell->value = $activation;
  98.     $row++;
  99. }
  100. // save the new file
  101. if (file_exists($strPath)) {unlink($strPath);}
  102. $wkb->SaveAs($strPath);
  103. //close the book
  104. $wkb->Close(false);
  105. $excel->Workbooks->Close();
  106. //free up the RAM
  107. unset($sheet);
  108. //closing excel
  109. $excel->Quit();
  110. //free the object
  111. $excel = null;
  112. }


 
Voili, voilou :)

Reply

Marsh Posté le 24-07-2006 à 16:09:11    

attention, c'est du COM! Sur un serveur en production, tu risques d'avoir un pb d'alloc de mémoire au bout d'une certain temps car $excel->Quit() ne fonctionne pas bien. Le processus excel reste toujours en mémoire.
Tu devrais voir du côté de la lib sous GPL "Spreadsheet_Excel_Writer" : http://pear.php.net/package/Spreadsheet_Excel_Writer

Reply

Marsh Posté le 24-07-2006 à 16:23:45    

Merci beaucoup... je vais looké cela.
 
Y'a t il une fonction qui permette le download du fichier sur le poste client ???
 
Car là je lutte vraiment pour faire fonctionner cela correctement... Je m'explique...
 
Comme je n'ai pas réussi à générer + downloader le fichier directement, je passe en 2 étapes comme indiqué ci-dessus... pas très pratique.
Et lors de l'étape du clic sur 'Enregistrer le fichier'... il ne se passe rien !!! Ce n'est qu'au clic suivant que le processus du header se déclenche et me demande d'enregistrer le fichier !!!
 
Je comprends pas trop là !!!
 
Si z'avez des ampoules pour m'apporter de la lumière, n'hésitez pas ;)

Reply

Marsh Posté le 24-07-2006 à 17:36:26    

Bon je viens de mettre en place ma meme fonction de génération de fichier mais via Spreadsheet_Excel_Writer et PEAR.
 
Mais j'ai toujours le meme souci pour ce qui est de l'enregistrement du fichier !!! :(

Reply

Marsh Posté le 24-07-2006 à 17:44:33    

jordel a écrit :

Bon je viens de mettre en place ma meme fonction de génération de fichier mais via Spreadsheet_Excel_Writer et PEAR.
 
Mais j'ai toujours le meme souci pour ce qui est de l'enregistrement du fichier !!! :(


 
mais t'auras plus le pb de mauvaise désalloc mémoire :)

Reply

Marsh Posté le 24-07-2006 à 17:44:33   

Reply

Marsh Posté le 24-07-2006 à 17:46:16    

:)
 
Merci... c'est vrai que meme au niveau du temps de chargement du fichier... c'est plus rapide !!! :)
 
Cependant... j'ai toujours ce fu*ù$^# probleme avec la sauvegarde du fichier ! :(

Reply

Marsh Posté le 25-07-2006 à 11:16:34    

Bonjour,
 
Bon j'arrive bien à enregistrer mon fichier Excel comme dit ci-dessus...
 
Mais !!! ma page ne se recharge pas derrière...
Normal me direz vous, car la génération et l'enregistrement du fichier se font dans le header.
 
Mais alors comment faire pour charger sa page et lancer l'enregistrement sans avoir de Warning sur l'utilisation des headers ???
 
Merci d'avance...

Reply

Marsh Posté le 25-07-2006 à 14:07:53    

y'a peut-être plus simple, mais sinon, une fois la page qui génère le fichier chargée, tu peux tenter un redirection en javascript vers celle qui lance le téléchargement...:/

Reply

Marsh Posté le 25-07-2006 à 14:31:50    

Ou avant la génération du fichier mettre :
header("Refresh: 1; URL=fleFichier" );

Reply

Marsh Posté le 25-07-2006 à 16:32:18    

Merci pour ces conseils... je teste et reviens vers vous ;)

Reply

Marsh Posté le 25-07-2006 à 17:01:01    

Bon... ça redirige pas !!! snifff...
 
Le problème vient du fait que la fonction doit se faire en header... sinon ça passerait tout seul !!! Dommage !!!
 
Hop un ptit schéma :
http://img125.imageshack.us/img125/4617/schematl5.jpg

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed