Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [php] "Speichern unter"-Dialog? (https://www.delphipraxis.net/69066-%5Bphp%5D-speichern-unter-dialog.html)

Grolle 9. Mai 2006 19:52


[php] "Speichern unter"-Dialog?
 
Hallo,

wie realisiere ich mit php einen "Speichern unter"-Dialog? Ich möchte eine
Datenbank in eine *.csv-Datei exportieren. Den Export mache ich wie folgt:
Delphi-Quellcode:
<?php

include "connect.inc.php";
$fp = fopen('file.csv', 'w');
$sql = "SELECT name, vorname, strasse FROM adressbuch";
$res = mysql_query($sql) or die("Fehler:
" . mysql_error() . "
$sql");
while($row = mysql_fetch_row($res)){
    $line = implode(';', $row);
    fwrite($fp, $line . "\r\n");
}
fclose($fp);
?>
Viele Grüße,

faux 9. Mai 2006 19:55

Re: [php] "Speichern unter"-Dialog?
 
Hallo!

Biete sie einfach zum Download an.

Beispiel:
Code:
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=".$filename);
Grüße
Faux

mkinzler 9. Mai 2006 19:57

Re: [php] "Speichern unter"-Dialog?
 
Code:
header( 'Content-Disposition: attachment; filename='.$fname);
[Edit: War zu langsam]

Grolle 9. Mai 2006 19:59

Re: [php] "Speichern unter"-Dialog?
 
Hi,

muss ich das nach dem fclose($fp) setzen?
Bin PHP-Neuling :roll:

Viele Grüße..

mkinzler 9. Mai 2006 19:59

Re: [php] "Speichern unter"-Dialog?
 
Nein vor deinen Code.

Grolle 9. Mai 2006 20:05

Re: [php] "Speichern unter"-Dialog?
 
Hi,

das klappt zwar, aber jetzt wird nix mehr in die Datei geschrieben ?!?

Flare 9. Mai 2006 20:11

Re: [php] "Speichern unter"-Dialog?
 
Eigentlich müsste es danach geschrieben werden, weil die Datei innerhalb deines Skriptes erstellt wird, also nachdem der Download gestartet hat, dann kannst du wenig runterladen :zwinker:
Ich glaube (ich arbeite nicht mit header() direkt), dass er beim Aufruf von
Code:
header( 'Content-Disposition: attachment; filename='.$fname);
sofort den Download startet.


Flare

faux 9. Mai 2006 20:12

Re: [php] "Speichern unter"-Dialog?
 
Poste mal deinen Code.

Zitat:

Zitat von Flare
Ich glaube (ich arbeite nicht mit header() direkt), dass er beim Aufruf von
Code:
header( 'Content-Disposition: attachment; filename='.$fname);
sofort den Download startet.

Weiß auch nicht ob da so ist, aber selbst wenn das so wäre, wäre der Download erst abgeschlossen, wenn die Seite fertig geladen ist, also ists auch wieder ok.

Grüße
Faux

noch_ein_hannes 9. Mai 2006 20:14

Re: [php] "Speichern unter"-Dialog?
 
Du brauchst gar keine Datei zu schreiben, denn mit dem Header lenkst Du die Ausgabe ja um:
Delphi-Quellcode:
header( 'Content-Disposition: attachment; filename='.$fname);
$sql = "SELECT name, vorname, strasse FROM adressbuch";
$res = mysql_query($sql) or die("Fehler:
" . mysql_error() . "
$sql");
while($row = mysql_fetch_row($res)){
    $line = implode(';', $row);
    echo $line . "\r\n";
}
wenn Du schon eine Datei hast, kannst Du sie (nach dem Header) einfach mit readfile() ausgeben ...

DGL-luke 9. Mai 2006 20:14

Re: [php] "Speichern unter"-Dialog?
 
nene! Erst der header, dann die Infos.

Also:

- Daten bereithalten/erzeugen/öffnen
- Header schicken
- Daten schicken

für weitere Analyse bräuchten wir ein bisschen Code, Grolle.

//roter kasten... ja...

EDIT: nein, ein Header leitet gar nix um. Wenn er nicht der Location-Header ist.
Der Content-Disposition-Header sagt nur, welcher Datentyp (genauer MIME-typ) zu erwarten ist, damit der User Agent entsprechend reagieren kann.

Grolle 9. Mai 2006 20:15

Re: [php] "Speichern unter"-Dialog?
 
Hi,

der code oben ist alles, was in der *.php-datei steht!

Viele Grüße,

// Edit: Aufrufen tue ich die Datei über einen einfachen Link

DGL-luke 9. Mai 2006 20:17

Re: [php] "Speichern unter"-Dialog?
 
öhm.. ok.. dann stimmts so, wie es noch_ein_hannes geschrieben hat.

Du musst dem Browser schließlcih die Daten auch liefern, wenn du da nur auf deinem server rumschreibst, passiert gar nix ;)

mkinzler 9. Mai 2006 20:20

Re: [php] "Speichern unter"-Dialog?
 
Den Umweg über die datei kannst du dir sparen, wenn du das Ergebnis der Abfrage direkt ausgibst:


Code:
<?php

include "connect.inc.php";
header( 'Content-Disposition: attachment; filename='.$fname);

$sql = "SELECT name, vorname, strasse FROM adressbuch";
$res = mysql_query($sql) or die("Fehler:
" . mysql_error() . "
$sql");
while($row = mysql_fetch_row($res)){
    $line = implode(';', $row);
    echo "$line . "\r\n";
}
?>

noch_ein_hannes 9. Mai 2006 20:28

Re: [php] "Speichern unter"-Dialog?
 
hmm, mkinzler ... das kommt mir sehr bekannt vor ... :-)

mkinzler 9. Mai 2006 20:43

Re: [php] "Speichern unter"-Dialog?
 
Sorry, deinen Beitrag habe ich genauso wie Grolle überlesen.

Grolle 9. Mai 2006 21:11

Re: [php] "Speichern unter"-Dialog?
 
Besten Dank. Das klappt so ganz gut :mrgreen:

nat 9. Mai 2006 22:30

Re: [php] "Speichern unter"-Dialog?
 
Zitat:

Zitat von faux
Code:
header("Content-type: text/csv");

wenn man sich 100% sicher seien will, dass der speichern unter dialog kommt sollte man
Code:
Content-type: application/octet-stream
verwenden.
der browser entscheidet anhand des mime-types, was er mit den empfangenden
daten macht. was, wenn er nun eine spezielle darstellung für csv-dateien hat
(ähnlich wie xml-files)? dann kommt der dialog nicht. o.g. bedeutet ein
unbekanntes/binäres format für das es keine anzeigeform geben kann.
daher sollte immer der speichern unter dialog kommem.

noch_ein_hannes 9. Mai 2006 22:45

Re: [php] "Speichern unter"-Dialog?
 
So wäre es komplett:
Delphi-Quellcode:
header("Content-Disposition: attachment; filename=".$save_as_name."");
header("Content-type: x-application/octet-stream");
header("Content-Transfer-Encoding: binary");
Und, wenn die Ausgabe einer Datei per "readfile()" geschieht, dann könnte auch noch folgender Header gesendet werden:
Delphi-Quellcode:
header("Content-length:".filesize($filename)."");

faux 10. Mai 2006 10:04

Re: [php] "Speichern unter"-Dialog?
 
Zitat:

Zitat von noch_ein_hannes
Und, wenn die Ausgabe einer Datei per "readfile()" geschieht, dann könnte auch noch folgender Header gesendet werden:
Delphi-Quellcode:
header("Content-length:".filesize($filename)."");

Das kann man ohne weiteres auch machen, wenn man das ganze ohne readfile() löst: Einfach alles was man ausgeben würde in eine Variable speichern (statt echo "$line . "\r\n"; einfach $out .= "$line . "\r\n"; schreiben) und dann per strlen() die Länge bestimmen.

Grüße
Faux

Grolle 10. Mai 2006 10:15

Re: [php] "Speichern unter"-Dialog?
 
Ja, besten Dank nochmal an euch. Klappt hervorragend!
PHP scheint ja hier sehr populär zu sein :)
Viele Grüße...


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz