Hallo,

ik heb onderstaande code op het php.net gevonden.
Door gebruik te maken van Content-Disposition wordt het browser opslaan-als scherm getriggered.

Maar wanneer ik deze regel blok dan wordt niet de inhoud van het tekst bestand getoond, maar komt alsnog het opslaan-als scherm.

Wat doe ik hier fout?


<?php

$naam="tekst.txt";

$mm_type="application/octet-stream";

header("Cache-Control: public, must-revalidate");
header("Pragma: hack");
header("Content-Type: " . $mm_type);
header("Content-Length: " .(string)(filesize($naam)) );
//header('Content-Disposition: attachment; filename="'.basename($naam).'"');
header("Content-Transfer-Encoding: binary\n");

$fp = fopen($naam, 'rb');
$buffer = fread($fp, filesize($naam));
fclose ($fp);
print $buffer;

?>
Welke foutmelding krijg je dan?

of krijg je alle tekst gewoon (binair) te zien?

Ik krijg geen foutmelding.

De code hierboven staat in een bestand genaamd 'index.php'.
Het normale IE opslaan-als scherm verschijnt, en de voorgestelde bestandsnaam is 'index.php'.

Het lijkt dus wanneer je naar de naam kijkt alsof index.php verstuurd word, maar wanneer je het bestand opslaat dan staat er gewoon de inhoud van de tekst file in.

Het doet het dus eigenlijk half. Ik verwacht eigenlijk dat de IE de inhoud van de tekstfile laat zien.

Update:
Wanneer je de regel met Content-Type blokt dan gaat het wel goed.
Misschien dat je geen content-type moet opgeven wanneer je de inhoud in de browser wilt laten zien?
hmm
dit is wat ik gebruik voor een csv scriptje:

//show headers:
@header("Pragma: public"); // required 
@header("Expires: 0"); 
@header("Content-disposition: attachment; filename=\"".$tabel."postbankdump.csv\"\r\n"); 
@header("Content-transfer-encoding: binary\n"); 
@header("Content-Type: application/csv-tab-delimited-table"); 
@header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 

//ga database data ophalen:
$sql  .= "SELECT\n";
$sql .= "	*,\n";
$sql .= "FROM relaties AS r\n";
$query = mysql_query($sql) or die(nl2br($sql));

//ga de titel velden na uit de database
$numberfields = mysql_num_fields($query);
for ($i=0; $i<$numberfields ; $i++ ) {
  $row_title .= mysql_field_name($query, $i) . ";";
}
//plaats deze in var csv
$csv = $row_title . "\n";

//ga de rest v/d database ophalen
while ($data = mysql_fetch_object($query)) {
	$csv .= $data->relatienummer . ";" . $data->bedrijfsnaam  . ";" . $data->adres  . ";" . $data->postcode  . ";" . $data->woonplaats  . ";" . $data->aanhef  . ";" . $data->tussenv  . ";" . $data->voorletters  . ";" . $data->voornaam  . ";" . $data->achternaam  . ";" . $data->mobielnr  . ";" . $data->mailadres . "\n";
}

//output (dus uiteindelijk naar de download)
echo $csv;
uncomment de volgende regel uit je script en het werkt.

//header('Content-Disposition: attachment; filename="'.basename($naam).'"');
Hi Leroy,

in mijn orginele post geef ik al aan dat dit de switch is tussen wel/geen opslaan-als scherm. ;)

Ik moet echter ook nog de regel met Content-Type blokken zodat de inhoud van het tekstbestand in de browser wordt getoond.

Groet...
waarom maak je er geen if statement die de headers afschermen?

if ($_GET['download'] != 0) {
$mm_type="application/octet-stream";

header("Cache-Control: public, must-revalidate");
header("Pragma: hack");
header("Content-Type: " . $mm_type);
header("Content-Length: " .(string)(filesize($naam)) );
//header('Content-Disposition: attachment; filename="'.basename($naam).'"');
header("Content-Transfer-Encoding: binary\n");
}

andere optie:

de headers moeten gaan aangeven dat het om text/html gaat ivp application/octet-stream
Bedankt Leroy,

text/html is het antwoord! Stom van mij.

Super...
uhmmm ppientje,

Dit werkt in ie niet; dan moet je de headers weglaten waarom weet ik ook niet, in firefox gaat het wel goed.
Ik gebruik nu dit, en dat werkt bij mij in IE7 en FF2.


<?php

$naam="tekst.txt";

//$mm_type="application/octet-stream";
$mm_type="text/html";

header("Cache-Control: public, must-revalidate");
header("Pragma: hack");
header("Content-Type: " . $mm_type);
header("Content-Length: " .(string)(filesize($naam)) );
//header('Content-Disposition: attachment; filename="'.basename($naam).'"');
header("Content-Transfer-Encoding: binary\n");

$fp = fopen($naam, 'rb');
$buffer = fread($fp, filesize($naam));
fclose ($fp);
print $buffer;

?>


Dit werkt bij jou toch ook wel?
in ie7 niet getest, in ie 6 werkt het niet.

werkt half, hij lijkt de headers die opnieuw verzonden worden niet te begrijpen, dus dan zou er wat mis zijn met de cache van temporary files?

Reageren