Chris: filedownload problem mit fgets()

hallo,

wenn ich nen filedownload in php realsiere und fgets() verwende muss ich die file erst local speichern und kann sie erst danach öffnen. öffnet man die file direkt beim download passiert praktisch nix. als wenn die file nicht existiert oder ... ? hab keine idee wieso es zu diesem fehler kommt.

hat einer eine idee?

(( mit readfile() funktioniert es, aber wieso nicht mit fgets() ? ))

grüße Chris

if($fp = fopen($file,"rb")){

header("Content-Description: File Transfer");
header("Cache-Control: ", true);
header("Content-Type: application/download");
header("Content-Disposition: attachment; filename=".basename($array["filename"].".".$array["fileextension"]));
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".@filesize($file));

set_time_limit(0);

while (!feof($fp)) {
       echo fgets($fp, 4096);
    }
    fclose($fp);
} else {
    die("Datei kann nicht gefunden/geöffnet werden!");
}

  1. Hi,

    wenn ich nen filedownload in php realsiere und fgets() verwende muss ich die file erst local speichern und kann sie erst danach öffnen. öffnet man die file direkt beim download passiert praktisch nix. als wenn die file nicht existiert oder ... ? hab keine idee wieso es zu diesem fehler kommt.

    hat einer eine idee?

    Also wenn ich das PHP Manual richtig deute, unterstützt fgets den Wrapper nicht, um entfernte Dateien zu lesen.

    Ich tippe mal darauf, das es nicht möglich ist, beim Download einen Socked zum Server aufzubauen, den du ja für fgets brauchst. Wird dir nichts anderes übrigbleiben, als die Datei per readfile() zu holen und dann aus dem Array zu verarbeiten

    MfG
    Manuel

  2. Hello,

    fgets() und fopen($file,"rb")

    passen klassisch betrachtet nicht zusammen.

    der Öffnungsmodus 'rb' fordert eine Behandlung des Files als Byte-Stream an, fgets() will die Datei aber 'zeilenweise' lesen, also als Textdatei.

    Nimm also entweder 'r' und fgets(), wenn Du Zeilen wünschst, oder aber fread() und 'rb', wenn Du nur die Datei haben willst und transparent weiterleiten willst.

    Und bei fread() solltest Du die "Packete" etwas kleiner (256Byte) schnüren, das vermindert den Kummer.

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

    Tom

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

      ich weiss zwar net obs daran gelegen hat, aber in jeden fall scheint es jetzt keine probleme mehr zu machen. :D

      grüße Chris

      1. Hello,

        ich weiss zwar net obs daran gelegen hat, aber in jeden fall scheint es jetzt keine probleme mehr zu machen. :D

        Ich habe auch noch lange darüber nachgedacht, in wieweit diese Aussage für das heuteige PHP gilt. Aber alleine die klassische Entwicklung der Filezugriffe seit CP/M deutet auf diesen Konflikt hin. Der "Fehler" liegt eigentlich in der C-Schicht, im halbherzigen Versuch, eine Abstraktion einzuführen.

        Bei Programmen/Entwicklungssystemen, die auf Pascal basieren, wäre dieser Fehler ausgeschlossen, da hier nicht die Funktion, sondern das Handle die Zugriffsart bestimmen würde. Und das ist mMn richtig!

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

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau