Header - Content-Disposition
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?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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;
?>
$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;
?>
of krijg je alle tekst gewoon (binair) te zien?
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?
Gewijzigd op 01/01/1970 01:00:00 door ppientje
dit is wat ik gebruik voor een csv scriptje:
Code (php)
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
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
//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;
@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;
//header('Content-Disposition: attachment; filename="'.basename($naam).'"');
Gewijzigd op 01/01/1970 01:00:00 door 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...
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
Gewijzigd op 01/01/1970 01:00:00 door leroy
text/html is het antwoord! Stom van mij.
Super...
Dit werkt in ie niet; dan moet je de headers weglaten waarom weet ik ook niet, in firefox gaat het wel goed.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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;
?>
$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?
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?
Gewijzigd op 01/01/1970 01:00:00 door leroy
Ik heb net getest op een computer met XPpro en IE6 en daarin verschijnt de tekst gewoon in de browser.
Zet ik Content-Disposition weer aan dan verschijnt zoals het hoort weer het opslaan-als scherm.
toch zou ik persoonlijk kiezen voor de andere optie die ik aandroeg:
gewoon de headers weglaten (=normal behaviour) voor browsers :)
Ik houdt het header script achter de hand voor andere bestandstypen.
Bedankt...
Gewijzigd op 01/01/1970 01:00:00 door ppientje