# Generierte Datei zum Download anbieten?



## BeaTBoxX (16. September 2004)

Hallo zusammen,

hab mal wieder ein Problem 

Ich möchte Daten aus meiner mySQL DB auslesen und daraus eine CVS Datei erstellen, die dann in Excel usw importierbar ist.
Der Inhalt der Datei ist schon komplett ( String bzw Array)
Allerdings soll der Benutzer die Datei per Link-klicken downloaden können.
Meine Frage nun:
Kann ich das bewerkstelligen OHNE erst eine Datei auf dem Server zu erstellen, den Inhalt reinzuschreiben und dann die Datei zu verlinken?

Geht das auch irgendwie direkt?
Es lassen sich ja auch direkt  Scripte per link anstossen , die Bilder generieren. Ist das so vergleichbar auch möglich , und wenn ja wie?

Vielen Dank

Gruß
Frank


----------



## Nils Hitze (16. September 2004)

Lies mal http://www.php.net/header da müsste irgendwo ein Downloadheader stehen, der bewirkt den sofortigen Download der Datei. Also einfach ausgeben die Daten und davor den Header setzen.

Nachtrag : 

header('Content-Disposition: attachment; filename="downloaded.pdf"');


----------



## BeaTBoxX (16. September 2004)

Wie meinst du "einfach header und danach die Daten ausgeben"?

Einfach so ?


```
header("Content-type: application/download");
     header('Content-Disposition: attachment; filename="rechte_uebersicht.cvs"');
     print $cvsinhalt;
```

habe beim Suchen noch das hier gefunden:
http://www.tutorials.de/forum/showthread.php?threadid=162782&highlight=header+download
Das is doch im Prinzip das gleiche oder?

leider funktionierts nicht ..:rolleyes ich bekomme den Inahlt, der in der Datei stehen sollte als text im Browser angezeigt.
Sieht evtl wer ob ich noch irgend nen Fehler mache?

Danke soweit ;-)

Frank


----------



## Lapsus (16. September 2004)

Wenn du den Download im Browser angezeigt bekommst, dann stimmt in der Regel der Header nicht. 

Dein Link, den den Benutzer anklickt zeigt auf "download.php?id=0815"

die download.php schaut dann folgendermassen aus:

```
<?
header("Content-type: application/oktet-stream");
header('Content-Disposition: attachment; filename="what-ever.cvs"'); 

if(isset($_GET['id])){
    mysql_connect();
    mysql_query();

     ...
     
     print($daten_string);

}
?>
```

Kleiner Tipp noch, mach beim Link noch target="_blank" oder das ganze per JavaScript in einem Popup


----------



## BeaTBoxX (16. September 2004)

Hmmm versteh nicht warums nicht geht..

Hier mal das Gesamte:



```
header("Content-type: application/oktet-stream");
    header('Content-Disposition: attachment;filename="rechteuebersicht.cvs"');

    // erste zeile mit orgaeinheitenbeschriftungen erstellen
    $dateizeilen[0]='';
    foreach($orga_array as $orga_unit) {
        $dateizeilen[0] .=';'.$orga_unit;
    }
    $dateizeilen[0].="\n";


    // zeilenweise den inhalt fuer die csv-datei erstellen
    $i=1;
    $kat_array = spaltenname();
    foreach($kat_array as $filezeile) {
        $dateizeilen[$i]=$filezeile;
        foreach($orga_array as $orga_unit) {
            if(check_orgaeinheit_rechte($orga_unit,$filezeile))
               $dateizeilen[$i].=';X';
            else
                $datenzeilen[$i].=';';
        }
        $dateizeilen[$i].="\n";
        $i++;
    }
     $cvsinhalt= implode('',$dateizeilen);
     print $cvsinhalt;
```

Ich weiss, dass es umständlich ist, erst ein Array zu erstellen und dann wieder zu Imploden. Aber ich hab das mit dem Header und einen String uebergeben erst späöter rausgefunden. Das war zum testen erstmal die einfachste Lösung.

Noch zur Erklärung: Inder Datei soll dann eine Matrix stehen, welche orga-einheit bei welcher kat(egorie) drin ist (mit X) oder nicht ([leer]).
Bin etwas ratlos


----------



## Lapsus (16. September 2004)

oh, ich glaub oktet-stream schreibt ich mit 'c'... sorry 
probier mal "octet-stream".

Was kommt denn bei dir? Ausgabe im Browser? 0 Byte Dateigrösse nach dem Download?
Fehlermeldunge?

Du kannst z.B. auch statt 

        $dateizeilen[$i].="\n"; 

direkt 

      print($dateizeile) machen.

Dann sparst du dir ein bischen Speicher.


----------



## BeaTBoxX (16. September 2004)

Jepp Ausgabe im Browser passiert.
Kein Download popup
Keine weiteren Meldungen.
So als hätte ich "print" ohne die ganze Headersachen gemacht.
Der oktet <->octet Tausch half leider auch nichts 
Fällt evtl noch wem was auf?


----------



## Lapsus (16. September 2004)

Also eigentlich ist alles richtig... (denke ich zumindest)

Probier mal beim Link, rechte Maustaste "Ziel speichern unter". Ich hab im Mozilla machmal auch das Problem, dass er keinen Download startet, sondern das im Browser anzeigt. Wenn das geht mit rechter Maustastet "Ziel speichern unter" klappt, dann liegt es an "nur" dem Header.


----------



## BeaTBoxX (16. September 2004)

AH ein Fortschritt 

Also ich hab das Script nun per Link aufgerufen und zwar mit target=blank
nun gehts insofern, dass ein download mit dme richtigen dateinamen aufpoppt.
Allerdings ist die Datei leer. hmmm
Ist es irgendwie wichtig in welcher Reihenfolge etwas ind er Datei steht?
also die header Befehle ganz oben und nichts mehr davor z.b.? oder sowas in der Art?


----------



## Sven Mintel (16. September 2004)

Täusche ich mich, oder sind da ein paar Anführungszeichen zu viel?

header('Content-Disposition: attachment;filename="rechteuebersicht.cvs"'); 


Ansonsten....mit deiner Vermutung liegst du richtig, vor dem header() darf nix ausgegeben werden...auch keine Leerzeichen.

Die ersten Zeichen im Skript sollten also <?php sein....und dann als nächstes die header()

Nimm doch mal die header heraus und versuche es dann mit "speichern unter"....steht dann immer noch ni drinne? Wenn ja, liegt der Fehler woanders.


----------

