• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

readfile fügt leere Zeile ein

S

sysop

Guest
Hallo

Ich kämpfe hier mit einem kleinen Problem.
Ich sende aus einer Datenbank Mails mit attachment und speichere diese Mails in der Datenbank als Archiv. Als "goodie" kann man diese Mails herunterladen und sich in einem Mailclient ansehen. Dazu speichere ich den Mailinhalt in einer Datei, die ich dann komplett herunterlade.

Die Datei wird korrekt erstellt, beim Download wird allerdings als erste Zeile eine Leerzeile eingefügt, die mir den Mailinhalt zerlegt und im Client unleserlich macht.

PHP:
        $sql = "SELECT * FROM `mailarchiv` WHERE `aid` LIKE '".$_POST['show']."'";
        // ist eine Funktion zum lesen von Daten
        $mails = myfetch_all($sql);

        $name = date("YmdHis",$mails[1][6]).".eml";

        $text .= trim(chop($mails[1][5]));

        // Daten schreiben
        myfwrite("temp/".$name,trim(chop($text)),'w');

        $size = filesize("temp/".$name);

        header("Content-type: application/octet-stream");
        header("Content-disposition: attachment; filename=$name");
        header("Content-Length: $size");
        header("Cache-control: private");
        header("Pragma: no-cache");
        header("Expires: 0");
        readfile("temp/".$name);
        unlink("temp/".$name);

Ist der header den ich sende.

Sehe ich mir die Datei in /temp im Editor an, ist sie korrekt, lade ich sie herunter und speichere die Datei, ist als erste Zeile eine Leerzeile zusätzlich dazu gekommen.
 
Werbung:
PHP:
        $sql = "SELECT * FROM `mailarchiv` WHERE `aid` LIKE '".$_POST['show']."'";

Die Zeile ist hoffentlich nur zur Verdeutlichung?

PHP:
        $text .= trim(chop($mails[1][5]));

chop() dürfte überflüssig sein. Was steht denn vorher in $text drin? Wieso .=?

In dem Zusammenhang:

PHP:
        // Daten schreiben
        myfwrite("temp/".$name,trim(chop($text)),'w');

Wieso erneut trim(chop())?

Warum den Inhalt überhaupt zwischenspeichern?

Hast du mal in einem Hexeditor geguckt, welche Bytes es sind, die die Leerzeile generieren? \r\n?
 
Werbung:
die trim(chops)) ,das sind alles Versuche nur ja nichts mit zu schelppen, ich versuche alles, um die Leerzeile abzufangen.

und print file_get_contents() erzeugt eine richtige Ausgabe?
Ja, Die Anzeige von temp/datei bekomme ist korrekt, das File hat keine Leerzeile, nach dem Download ist eine Leerzeile enthalten. Es kann also nur nach dem readfile() b.z.w. beim speichern der Datei passieren.

Das $_POST szenario ist auch nur, damit ich mir die übergebenen Werte genau ansehen kann.

PS.
das .= kommt daher, dass ich einen fake_header übergeben kann, in dem die Antwortmailadresse geändert werden kann.
komischer Weise funktioniert das readfile mit Bin Dateien, dort wird nichts eingefügt.

Nochmal zum verdeutlichen

Datei sieht so aus:

1 FROM: mailadresse

Download

1
2 FROM : mailadresse
 
Hast du mal versucht, eine Datei mit dem Editor auf dem Client zu erstellen, mittels FTP nach $temp kopieren und diese dann runter zu laden (also DB-Abfrage, Unlink alles weg) und stimmt die $size dann auch?
 
Nein, das habe ich noch nicht versucht, eine gute Idee, danke für den Tip.
Ich melde mich dann morgen wieder, für heute ist es genug.....

Danke an alle erst mal
 
Werbung:
Hallo und guten Morgen.

So, ich habe heute eine Datei erstellt und mit obigem Code per Download gezogen, es ist genau wie ich dachte, es liegt wohl an readfile, die Leerzeile ist wieder im Text.
Ausserdem muss ich mich korrigieren, auch bin-Files sind betroffen, ein .jpg wird genauso verstümmelt.


PS
Ich habe mir nun mit einem simplen
PHP:
header("Location: ");
geholfen. Eine Lösung ist das aber nicht...
 
Zuletzt bearbeitet von einem Moderator:
Die Lösung ist so einfach wie eigentlich logisch...

richtig muss der Code so aussehen:
PHP:
            ob_end_clean();
            header("Content-type: application/octet-stream");
            header("Content-disposition: attachment; filename=$name");
            header("Content-Length: ".filesize("temp/".$name));
            header("Cache-control: private");
            header("Pragma: no-cache");
            header("Expires: 0");
            readfile("temp/".$name);
            unlink("temp/".$name);
Der outpu_buffer sollte natürlich vor dem neu befüllen komplett geleert werden.

Danke an alle, die helfen wollten
 
Zurück
Oben