Sahra: Dateidownload ohne Sicherheitspopup

Hi,

ich erzeuge bei mir einen Download und zwar so:

$file="file.txt";
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=file.txt");
readfile($file);

Bei Servicepack 2 sagt mein Rechner aber: Download geblockt...

Wie kriege ich das denn nun weg?

Vielen Dank
Sahra

  1. Hello Sahra,

    ich erzeuge bei mir einen Download und zwar so:

    $file="file.txt";
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=file.txt");
    readfile($file);

    Bei Servicepack 2 sagt mein Rechner aber: Download geblockt...

    Wie kriege ich das denn nun weg?

    Handelt es sich denn bei der zu übertragenden Datei wirklich um ein Programm?
    Das sagst Du nämlich mit dem "application/octet-stream" dem Browser. Und wenn der nun ausnahmsweise mal keine Sicherheitlücke hat und den Benutzer vor einem Programm warnt, dann ist das vollkommen richtig.

    Den passenden MIME-Type für die datei kannst Du mit

    mime_content_type($PfadZurDatei)

    ermitteln ab PHP version 4.3.0

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. hi,

      Handelt es sich denn bei der zu übertragenden Datei wirklich um ein Programm?

      vermutlich nicht, wenn sie den dateinamen mit file.txt vorgibt.

      Das sagst Du nämlich mit dem "application/octet-stream" dem Browser. Und wenn der nun ausnahmsweise mal keine Sicherheitlücke hat und den Benutzer vor einem Programm warnt, dann ist das vollkommen richtig.

      Den passenden MIME-Type für die datei kannst Du mit
         mime_content_type($PfadZurDatei)
      ermitteln ab PHP version 4.3.0

      der dürfte wohl für eine textdatei text/plain lauten - nur damit zeigt der browser eine textdatei idR. wieder sofort an, anstatt sie zum download anzubieten.

      wenn der IE application/octet-stream mit SP2 nicht mehr akzeptieren will, bleibt vermutlich nur noch "speichern unter ..." als lösung, oder evtl. ein anderer content-type.

      gruß,
      wahsaga

      --
      "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
      1. Hello,

        Handelt es sich denn bei der zu übertragenden Datei wirklich um ein Programm?

        vermutlich nicht, wenn sie den dateinamen mit file.txt vorgibt.

        Darauf sollte sie doch selbst kommen ;-)

        Das sagst Du nämlich mit dem "application/octet-stream" dem Browser. Und wenn der nun ausnahmsweise mal keine Sicherheitlücke hat und den Benutzer vor einem Programm warnt, dann ist das vollkommen richtig.

        Den passenden MIME-Type für die datei kannst Du mit
           mime_content_type($PfadZurDatei)
        ermitteln ab PHP version 4.3.0

        der dürfte wohl für eine textdatei text/plain lauten - nur damit zeigt der browser eine textdatei idR. wieder sofort an, anstatt sie zum download anzubieten.

        Dann Sollte sie den "force download"-Header  hinzugeben. Das verstehen inzwischen die meisten Browser und beachten es auch.

        Und http://de.php.net/manual/de/function.mime-content-type.php funktioniert i.d.R. auch nur dann, wenn der Webserver auf einem Linux-Host läuft.

        Sollte es dennoch nicht vorhanden sein, kann man sich meine Hilfslösung aus http://selfhtml.bitworks.de/debug/kontrolle.php rauskopieren und benutzen.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
    2. Hi Tom,

      also ich kriege die Fehlermeldung:

      Fatal error: Call to undefined function mime_content_type() in ...datei.php

      habe folgenden code

      mime_content_type('file.txt');

      und benutze die aktuellste php version auf dem server..

      Gibt es keine andere Headerfunktion?

      Bis dann
      Sahra

  2. Hallo

    Hi,

    ich erzeuge bei mir einen Download und zwar so:

    $file="file.txt";
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=file.txt");
    readfile($file);

    Bei Servicepack 2 sagt mein Rechner aber: Download geblockt...

    Ich vermute, Folgendes trifft zu:

    <zitat quelle="c't, 22-2004 Seite 218">
    Der Internet Explorer blockiert den Download von Dateien, die der Benutzer
    nicht explizit angefordert hat, sondern der zum Beispiel durch die HTML-
    Anweisung META REFRESH von einer Webseite initiiert wird.
    </zitat>

    Deine Datei wird ja nicht direkt zum Download verlinkt, sondern es wird ein
    Skript aufgerufen, dass die "file.txt" per Header ausliefert. Somit greift
    der Schutz des SP 2, da es sich auch um Schadcode handeln könnte.

    Wie kriege ich das denn nun weg?

    <zitat quelle="c't, 22-2004 Seite 219">
    [... Beschreibung der Möglichkeit, die Adresse der Datei zu ermitteln, falls
    sie im Link als Parameter angehängt ist [1] ...] Leider lässt sich nicht immer die
    Adresse der Datei ... ermitteln ... . Dann kann der Benutzer durch einen Klick
    auf die Warnung unter der Adresszeile dem Internet Explorer den Download erlauben.
    </zitat>

    Ob es in dem Zusammenhang so schick aussieht, dem verschreckten Benutzer auf
    der Website einen Beruhigungstext zu präsentieren, ist eine andere Frage.

    [1] Kommt auf die Art der Übergabe an.

    • http://www.example.com/index.html?file=http://www.example.com/downloads/file.txt
      Hier lässt sich der "Standort" der Datei rekonstruieren.
    • http://www.example.com/index.html?file=219
      Weiterverarbeitung durch Skript -> Warnung ignorieren oder Datei nicht downloaden

    Tschö, Auge

    --
    Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
    (Victor Hugo)