[php] Problemen met *.rtf generator in IE

Pagina: 1
Acties:

Onderwerpen


  • 2_05
  • Registratie: November 2004
  • Laatst online: 16-09 10:46
Ik heb een scriptje draaien onder php 4.1 :$. Nadat je een formuliertje hebt ingevuld zorgt een php scriptje ervoor dat er mooie RTF code geproduceerd wordt die vervolgens verzonden moet worden naar een Word document.

Werkt allemaal prima in FF, krijgt mooi een venstertje waarin de goede bestandsnaam te zien is en je kan kiezen tussen openen en opslaan, waarna die het gewenste resultaat geeft.

Maar IE6 (7 weet ik niet) geeft bij mij problemen, er komt wel een venster waarin je kan kiezen tussen openen en opslaan, maar als bestandsnaam wordt de link weergegeven:
Name: ...tart_testfile_php?meeting_datum=2007-09-13doc=1
Waar is trouwens de & gebleven en wat doet die underscore in de naam? Heb ook al geprobeerd die &doc weg te laten in het form maar dat hielp ook niet. Het wordt wel herkend als word document. Als je nu op openen klikt gebeurt er niks, druk je op save dan volgt de melding:
Internet Explorer cannot download ...hp?meeting_datum=2007-09-13&doc=1 from [website].
Internet Explorer was not able to open this Internet site. The requested site is either unavailable or cannot be found. Please try again later.
HTML:
1
2
3
<form name="notulen" method="POST" action="notulen_start_testfile.php?meeting_datum=2007-08-30&amp;doc=1">
...
</form>


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$filename = 'MEETING_'.date('dmY',strtotime($_GET['meeting_datum'])).'.doc';
    
header("Content-Type: application/msword");
header("Content-Disposition: attachment;filename=\"".$filename."\"");//to force open/download
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Datum in het verleden
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");   // Altijd veranderd
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
//header("Pragma: no-cache");                          // HTTP/1.0
//header("Content-Transfer-Encoding: binary");  //de encoding (semi verplicht)         

ob_start(); 
//-----------start rtf file--------------
echo "{\\rtf1"; 
...
echo "}";
header("Content-Length: ".ob_get_length()); //de size (semi verplicht)
ob_end_flush();



Nu dacht ik dat het misschien komt omdat ik de grootte van het bestand niet meegeef in de header (, maar hoe bepaal ik de grootte van iets wat nog gegeneerd moet worden? (Random waardes helpen ook niet).(inmiddels aangepast) Of heeft het te maken met een verouderde php versie?

[ Voor 3% gewijzigd door 2_05 op 06-09-2007 22:43 . Reden: quotes ingevoegd, ob instructies ingevoegd ]


  • Johnny
  • Registratie: December 2001
  • Laatst online: 14:39

Johnny

ondergewaardeerde internetguru

De grootte bepaal je door het te genereren naar een buffer (variable) die je dan kan opslaan of weergeven.

PHP heeft ook output buffering functies dje je daarmee kunnen helpen zoals ob_start(), ob_get_contents() en ob_get_length()

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


  • GlowMouse
  • Registratie: November 2002
  • Niet online
Je action is een string, en die moet dus tussen quotes komen. Hier op het forum zie je ook een rode streep onder de action, wat meestal een teken is dat er een fout in zit.
Nu dacht ik dat het misschien komt omdat ik de grootte van het bestand niet meegeef in de header, maar hoe bepaal ik de grootte van iets wat nog gegeneerd moet worden? (Random waardes helpen ook niet). Of heeft het te maken met een verouderde php versie?
Eerst de hele output in een string zetten, en daarna met strlen de lengte opvragen. Omdat ieder karakter een byte inneemt, is de grootte in bytes gelijk aan de stringlengte.

  • 2_05
  • Registratie: November 2004
  • Laatst online: 16-09 10:46
Nu de quotes toegevoegd, en onderstaande code ingevoegd. Maar nog hetzelfde resultaat.
PHP:
1
2
3
4
5
6
//toegevoegd onder de headers, voor echo "{\\rtf1";
ob_start();

//toegevoegd na echo "}";
header("Content-Length: ".ob_get_length()); //de size (semi verplicht)
ob_end_flush();


Ik heb het resultaat ook in de startpost verwerkt

[ Voor 8% gewijzigd door 2_05 op 06-09-2007 22:42 ]


  • B-Man
  • Registratie: Februari 2000
  • Niet online
Probeer eens (mits je met sessies werkt) het volgende:
PHP:
1
session_cache_limiter('public');

(Dit moet je aanroepen voordat je headers stuurt).

[ Voor 19% gewijzigd door B-Man op 12-09-2007 11:25 ]