Frederik Müller: Datei-Download ohne Öffnen der entsprechenden Applikation

Hi Leute,

folgendes Problem:

Der User soll sich eine serverseitig generierte Datei herunterladen können (z.B. Tabellen-Dump).

Dazu generiere ich die Daten als lokale Datei auf dem Server und mache anschließend ein header-forward auf diese Datei.

Das Problem ist, daß sich dann z.B. bei einer .csv-Datei immer Excel öffnet. Es soll aber der ganz normale Download-Dialog erscheinen.

Wie kann ich das in PHP machen?

Dank für schnelle Hilfe...

Frederik

  1. Der User soll sich eine serverseitig generierte Datei herunterladen können (z.B. Tabellen-Dump).

    Dazu generiere ich die Daten als lokale Datei auf dem Server und mache anschließend ein header-forward auf diese Datei.

    Das Problem ist, daß sich dann z.B. bei einer .csv-Datei immer Excel öffnet. Es soll aber der ganz normale Download-Dialog erscheinen.

    Wie kann ich das in PHP machen?

    Du kannst die Datei auch direkt aus Deinem Skript senden, indem Du erst den Inhaltstyp als unbekannt ankündigst und dann per readfile() durchschiebst. Damit sparst Du einen zusätzlichen Verbindungsaufbau (unter Umständen).

    header("Content-Type: application/x-msdownload");
      readfile("blabla.csv");

    Statt "application/x-msdownload" wird häufig auch auf "application/octet-stream" hingewiesen. Das ist zwar inhaltlich auch korrekt, da der IE sich aber mit seinem, aus Microsoft'scher Sicht fürchterlich dämlichen und/oder faulen Benutzer sehr viel Mühe gibt, in diesem Zuge Server-Hinweise ignoriert und stattdessen lieber sämtliche Daten inspiziert, um vielleicht doch noch ein passendes Programm zu finden, funktioniert octet-stream nicht immer.

    Gruß,
      soenk.e

    1. Also: im IE absolut kein Problem.
      Aber: im NS kommt zwar der Download-Dialog, die Datei heißt aber so, wie die entsprechende php-Datei, der Inhalt allerdings ist der korrekte.

      Das heißt, unter NS kommt eine Datei namens request.php, und drin steht der Inhalt der .csv-Datei.

      Ginge es wenn ich browsergerecht bei IE den msdownload-header und bei NS/Opera usw den octet-stream verwende?

      1. Sorry, ich habe nicht genau genug hingeschaut. Das Problem ist in allen Browsern das gleiche. Statt dem Namen der Download-Datei kommt der Name der PHP-Datei, allerdings mit dem richtigen Inhalt.

        1. Dann sag ich mal danke schön. Funktioniert perfekt.

      2. Also: im IE absolut kein Problem.
        Aber: im NS kommt zwar der Download-Dialog, die Datei heißt aber so, wie die entsprechende php-Datei, der Inhalt allerdings ist der korrekte.

        Hups, daran hab ich nicht gedacht. Probiere folgendes zusätzlich:

        header("Content-Disposition: attachment; filename=".$dateiname);

        $dateiname sollte nur aus ASCII-Zeichen bestehen, genauer: a-z (groß oder klein) und 0-9, sowie keine Pfadangabe.

        Gruß,
          soenk.e