Ralf Heumann: Datei wurde generiert und soll gleich downgeloaded werden

Hallo Leute.

Ich habe soeben eine Funktion geschrieben, welche mir Datenbankdaten ausgibt, und aus dem ganzen eine .csv - Datei generiert welche im gleichen Ordner gespeichert wird.

Ich möchte jedoch, dass diese Datei sofort wenn sie erstellt wurde downgeloaded wird.

Dazu dachte ich könnte ich mit header("Location: ...); arbeiten:

header("Location: http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/".$filename);
exit;

Alles was jedoch passiert ist, dass die Datei angelegt wird und anschließend erscheint der Inhalt der CSV-Datei im Browserfenster, es erscheint aber kein Fenster zum Speichern der Datei ("[Öffnen] [Speichern unter..])

Was kann ich tun?!

MFG Ralf Heumann

  1. hi,

    header("Location: http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/".$filename);
    exit;

    Alles was jedoch passiert ist, dass die Datei angelegt wird und anschließend erscheint der Inhalt der CSV-Datei im Browserfenster,

    ich nehme an, diese ausgabe hast _du_ in deinem script veranlasst? (echo, print, readfile, ...)

    es erscheint aber kein Fenster zum Speichern der Datei ("[Öffnen] [Speichern unter..])

    vor header() darf _keinerlei_ ausgabe an den client erfolgt sein.

    gruss,
    wahsaga

    1. Alles was jedoch passiert ist, dass die Datei angelegt wird und anschließend erscheint der Inhalt der CSV-Datei im Browserfenster,

      ich nehme an, diese ausgabe hast _du_ in deinem script veranlasst? (echo, print, readfile, ...)

      nope: Eine Ausgabe erfolgt nicht.
      Wenn mein File der erstellt wird payment.csv heisst erscheint der Inhalt der Datei im Browserfenster so als würde ich eine TXT Datei öffnen. Tatsächlich handelt es sich bei der zu generierenden Datei ja auch um TEXT, das ganze bekommt jedoch nur die Dateiendung .csv
      Das Endergebnis ist jedoch trotzdem, dass man die Datei in Zellen geordnet in Excel anschauen kann.

      Wenn ich als zu erstellenden Filenamen jedoch payment.zip wähle funktioniert das ganze so wie ich es gerne mit csv hätte wie folgender Link beweist:

      http://test.scientic.de/csv/getcsv.php

      Datei wird generiert, erstellt und gespeichert und der Header leitet sofort darauf weiter...

      gruss,
      wahsaga

      Ja Gruß zurück ...

      1. hi,

        nope: Eine Ausgabe erfolgt nicht.

        dann dürfte thomas mit seiner vermutung [pref:t=71809&m=413560] wohl richtiger liegen.

        gruss,
        wahsaga

        1. dann dürfte thomas mit seiner vermutung [pref:t=71809&m=413560] wohl richtiger liegen.

          Exactly.

          MFG
          Ralf heumann

      2. Hallo,

        Wenn mein File der erstellt wird payment.csv heisst erscheint der Inhalt der Datei im Browserfenster so als würde ich eine TXT Datei öffnen.

        Guck mal, mit welchem Content-Type der Server die Datei rausschickt:
        http://cgi.w3.org/cgi-bin/headers

        Wenn ich als zu erstellenden Filenamen jedoch payment.zip wähle funktioniert das ganze so wie ich es gerne [...] hätte

        Deine Frage geht in die Richtung "Download erzwingen".
        Such mal mit diesen Begriffen im Archiv.
        ZIP wird oft als zuverlaessigste Loesung empfohlen,
        wenn das "Download erzwingen" das wichtigste Ziel
        des Webpublishers ist.
        Fuer die Benutzer ist es jedoch IMHO viel angenehmer,
        wenn sie die Datei direkt verwenden koennen und sie
        nicht erst entpacken muessen.

        Es waere noch gut zu wissen, wer und wieviele Personen
        diese Sache ueberhaupt brauchen werden.
        Wenn es nur ein paar wenige Personen betrifft, und diese
        oft damit arbeiten muessen, waere ggf. "Erziehung"
        bzw. Browser-Wechsel die sinnvollste Variante.

        Wenn also der MS IE die Datei einfach anzeigt (trotz
        korrektem MIME-Type), waere noch eine Moeglichkeit,
        eine winzige HTML-Seite auszugeben und dort einen
        Link auf die CSV-Datei anzubieten mit der Beschreibung
        von "Rechtsklick -> Speichern unter..."
        (bzw. "Lange klicken -> Speichern unter" fuer Mac-Userlein.)

        Gruesse,

        Thomas

        --
        Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
        Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
        Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/
  2. Hallo,

    Dein Ansatz scheint mir richtig zu sein.

    Alles was jedoch passiert ist, dass die Datei angelegt wird und anschließend erscheint der Inhalt der CSV-Datei im Browserfenster,

    Liegt vermutlich daran, dass die CSV-Datei vom Server als text/plain
     ausgeliefert wird (ist bei Apache der Standard fuer saemtliche
    "unbekannten" Dateien) und der Browser deshalb denkt:
    "das kenn ich - das zeige ich selbst an!".

    Bennene die CSV-Datei mit der Dateiendung .csv, und ordne
    dieser Endung einen spezifischen MIME-Type zu.
    Sinnvoll waere z.B.
    text/comma-separated-values

    Dazu reicht bei Apache-Servern eine Zeile:
    AddType text/comma-separated-values .csv

    http://selfhtml.teamone.de/diverses/mimetypen.htm

    Gruesse,

    Thomas

    --
    Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
    Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
    Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/
    1. Dazu reicht bei Apache-Servern eine Zeile:
      AddType text/comma-separated-values .csv

      Ahaa.. aber scheinbar kann ich diesen Ausdruck nicht in mein Script als Parameter integrieren oder?!

      Leider habe ich keine Zugriffsrechte am Apache-Server um Einstellungen vorzunehmen..

      1. Hallo,

        Leider habe ich keine Zugriffsrechte am Apache-Server um Einstellungen vorzunehmen..

        Versuch es zumindest mal - einfach eine .htaccess machen
        und ins betreffende Verzeichnis hochladen.
        AddType ist oft zugelassen, auch wenn andere Dinge
        nicht funktionieren bzw. nicht erlaubt sind.

        AddType text/comma-separated-values .csv

        Gruesse,

        Thomas

        --
        Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
        Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
        Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/
  3. Hi,

    ich schätze es liegt daran, dass der IE csv Daten anzeigen kann (mit irgendeinem plugin)

    Zeigt er es auch an, wenn Du sie nicht .csv nennst?

    Grüßle

    --
    mal wieder auf http://www.booklinks.de vorbeigeschaut? Mittlerweile mehr als 900! Bücher.
  4. Alles was jedoch passiert ist, dass die Datei angelegt wird und anschließend erscheint der Inhalt der CSV-Datei im Browserfenster, es erscheint aber kein Fenster zum Speichern der Datei ("[Öffnen] [Speichern unter..])

    *verwirrt*
    Ich an nicht wirklich sagen woran es liegt, aber jetzt funktioniert es plötzlich, dass die .csv Datei im IST-Zustand heruntergeladen werden kann und der Inhalt NICHT mehr im Browser angezeigt wird...

    Test -> http://test.scientic.de/csv/getcsv.php

    Vielen Dank für die Unterstützung vor allem an Thomas, auch wenn ich jetzt (seltsamerweise) deine Hilfe nicht mehr benötige.

    Ich melde mich hier wieder falls es "seltsamerweise" auf einmal wieder nicht funktionieren sollte ...

    ;)

    MFG Ralf Heumann

    1. Hallo,

      Ich muss Dich enttaeuschen.
      Es "funktioniert" nicht.

      Test -> http://test.scientic.de/csv/getcsv.php

      Opera 5.12 zeigt die Datei
      http://test.scientic.de/csv/payment.csv
      direkt an.

      http://cgi.w3.org/cgi-bin/headers?url=http%3A%2F%2Ftest.scientic.de%2Fcsv%2Fgetcsv.php

      302 Found
      X-Powered-By: PHP/4.3.4
      Server: Apache
      Connection: close
      Location: http://test.scientic.de/csv/payment.csv
      Date: Mon, 09 Feb 2004 11:07:06 GMT
      Content-Type: text/html

      200 OK
      Content-Length: 223
      Accept-Ranges: bytes
      Server: Apache
      Last-Modified: Mon, 09 Feb 2004 11:07:06 GMT
      Connection: close
      Etag: W/"3253451-df-402769da"
      Date: Mon, 09 Feb 2004 11:07:06 GMT
      Content-Type: text/plain

      => Die generierte payment.csv wird als "text/plain" ausgeliefert.

      Gruesse,

      Thomas

      --
      Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
      Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
      Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/
      1. Content-Type: text/html

        :-/
        Ich denke nicht, dass auf meinem Webserver ein Zip-Plugin installiert ist ...

        Nun.. Pech: müssen sich die User eben den (!!)angezeigten Inhalt(!!) selbst in einer CSV Datei speichern...

        Vorübergehend ist das wohl nicht tragisch. Das Script wandert in ein paar Wochen sowieso auf meinen bald bestellten Root-Server. Dort kann ich dann den Apache wenigstens gescheit administrieren und das Problem lösen ...

        Ich hätte das Script nur eben gerne Freunden und Bekannten für ihre Zwecke gegeben.

        MFG
        Ralf Heumann

        1. Hallo,

          Ich denke nicht, dass auf meinem Webserver ein Zip-Plugin installiert ist ...

          Brauchst Du auch nicht.
          Ebensowenig wie Root-Zugriff oder Zugriff auf httpd.conf.

          Wie gesagt, wuerde ich zuerst mal versuchen,
          mit einer .htaccess-Datei dem Webserver
          beizubringen, .csv als "text/comma-separated-values"
          auszuliefern.

          Nun.. Pech: müssen sich die User eben den (!!)angezeigten Inhalt(!!) selbst in einer CSV Datei speichern...

          Das faende ich halb so tragisch.

          Ich hätte das Script nur eben gerne Freunden und Bekannten für ihre Zwecke gegeben.

          Da sehe ich kein Problem.
          Die .htaccess gehoert dann einfach zum "Paket" dazu...
          (Wirkt natuerlich nur auf Apache und evtl. einigen
          anderen Servern, aber der Apache ist ja schon mal
          sehr weit verbreitet. Und wer einen anderen Server
          hat, weiss hoffentlich selbst, ob und wie er
          .csv-Dateien einen bestimmten MIME-Type zuordnen kann...)

          Gruesse,

          Thomas

  5. Hello,

    probier doch bitte mal die Funktion aus. Ich habe damit bisher keine Probleme gehabt und immer das Download-Fenster

    [ ] Datei von diesem Ort öffnen
    [ ] Datei speichern

    bekommen.

    Kann es sein, dass das ganz individuell von den eingestellten Assoziationen des Clients abhängig ist?

    #--------------------------------------------------------------------
    function sendscript($path, $filename)
    {
      $filename = basename($filename);
      $filepath = $path."/".$filename;
      $len = @filesize($filepath);

    $fh = @fopen($filepath,"r");
      if (!$fh) return false;

    $data = fread($fh, $len);
      fclose($fh);

    $header = "";
      $header .= "Content-Type: text/plain\r\n";
      $header .= "Content-Disposition: attachment; filename="$filename"\r\n";
      $header .= "Content-type: application/force-download\r\n";
      $header .= "Accept-Ranges: bytes\r\n";
      $header .= "Content-Length: $len\r\n";

    header($header);
      echo $data;

    return true;
    }

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen