Download von Text Dateien - Störender HTML Code

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Download von Text Dateien - Störender HTML Code

    Grüße miteinander,

    ich habe einen kleinen Download Script geschrieben nach Vorlagen von php.net und anderen.

    Der Download funktioniert auch einwandfrei nur ist die Datei die heruntergeladen wird durch hässlichen HTML Code verschandelt .

    Diesen hätte ich gerne eliminiert.

    Ein zwei Punkte zur Umgebung:
    1. Der Script ist in eine Klasse eingebettet die Log Dateien erstellt. Aufgerufen wird der Script über eine Methode der Klasse.
    2. Die elementar wichtigen Informationen für den download werden während der Initialisierung eines Objekts von der oben erwähnten Klasse gesetzt (Filename usw.)
    3. Die Log Datei ist und soll eine .txt Datei sein.

    Der Code des Scripts sieht aus wie folgt:

    PHP-Code:
    function dlLogFile2()
           {
               
    //First, see if the file exists
               
    if (!is_file($this->_filename)) { die("<b>404 File not found!</b>"); }

               
    //Gather relevent info about file
               
    $len filesize($this->_filename);
               
    $filename basename($this->_filename);
               
    $file_extension strtolower(substr(strrchr($this->_filename,"."),1));

               
    //This will set the Content-Type to the 
              //appropriate setting for the file
               
    switch( $file_extension ) {
                  case 
    "exe"$ctype="application/octet-stream"; break;
                  case 
    "zip"$ctype="application/zip"; break;
                  case 
    "mp3"$ctype="audio/mpeg"; break;
                  case 
    "mpg":$ctype="video/mpeg"; break;
                  case 
    "avi"$ctype="video/x-msvideo"; break;
                  default: 
    $ctype="application/force-download";
               }

                
    //Begin writing headers
                
    header("Cache-Control:");
                
    header("Cache-Control: public");

                
    //Use the switch-generated Content-Type
                
    header("Content-Type: $ctype");
                if (
    strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
                   
    # workaround for IE filename bug with multiple periods /
                   #multiple dots in filename
                   # that adds square brackets to filename - eg. 
                   #setup.abc.exe becomes setup[1].abc.exe
                   
    $iefilename preg_replace('/\./''%2e'$filename
                   
    substr_count($filename'.') - 1);
                   
    header("Content-Disposition: attachment; 
                  filename=\"
    $iefilename\"");
                 } else {
                   
    header("Content-Disposition: attachment; 
                  filename=\"
    $filename\"");
                }
                
    header("Accept-Ranges: bytes");

                
    $size=filesize($this->_filename);

                
    //open the file
                
    $fp=fopen("$this->_filename","rb");
                
    //start buffered download
                
    while(!feof($fp)){
                    
    //reset time limit for big files
                    
    set_time_limit(0);
                    
    $string fread($fp,1024*8);
                    
    $clear stristr($string,"[Log]:");
                    print(
    $clear);
                    
    flush();
                    
    ob_flush();
                }
                
    fclose($fp);
                 exit;
           } 
    Am Ende der Funktion sieht man meine verzweifelten Versuche die HTML Zeilen herauszufiltern (Versuch String zu formatieren und diesen dann auf die Ausgabe zu schreiben). Jedoch nutzt das gar nichts. Ich vermute das Problem liegt irgendwo beim vorbereiten der Ausgabe also hat was mit den Content Types zu tun.

    Die verschandelte Log Datei sieht in etwa so aus:

    Zuerst einmal HTML Code und CSS Einstellungen danach sofort angehängt der eigentliche Inhalt der Log Datei.
    Beispiel:

    <html>
    <head>
    <title>XYZ file</title>
    <style type="text/css"> <!--
    BODY {
    scrollbar-face-color:#FFFFFF;
    scrollbar-highlight-color:#ADBEE7;
    .
    .
    .

    [Log]: [08-06-06|13:53:44]Connection XYZ usw!
    restliche Log Einträge.
    Die HTML Einträge am Anfang hätte ich nun gerne weg.

    Es sei anzumerken, dass ich einem bestehenden Tool Funktionen hinzufügen soll und das ohne große Veränderung. Das heisst ich kann relativ wenig an dem bestehenden Code herumpfuschen.

    Bisher habe ich niemanden gefunden, der ein ähnliches Problem hat, aber womöglich habe ich auch nur die falschen Suchbegriffe verwendet.

    Nun denn.

    Vielen Dank und mfg

    Encry
    Zuletzt geändert von EnCry; 08.06.2006, 13:12.
    Nec scire fas est omnia

  • #2
    du solltest erstmal rausfinden, woher das html kommt. ich denke mal, es ist die seite, die die funktion aufruft.

    wird wohl irgendwo so (oder so ähnlich) stehen:

    PHP-Code:

    <html>
    <head>
    <title>XYZ file</title>
    <style type="text/css"> <!--
    BODY {
    scrollbar-face-color:#FFFFFF;
    scrollbar-highlight-color:#ADBEE7;
    .
    .
    .
    <?php
       dlLogFile2
    ();
    ?>
    .
    .
    .
    </html>
    **********
    arkos
    **********

    Kommentar


    • #3
      Oh Pardon. Das habe ich vergessen zu erwähnen.

      Ja der miese HTML Code ist von der Seite in der der Methoden Aufruf steht.
      Also HTML Code, der über php "echos" erzeugt wird.

      Wie gesagt, ich muss meine Funktionen an ein bestehendes (sehr übles) Gerüst "hinmauern". Das ist auch eines der großen Probleme bei der ganzen Sache
      Nec scire fas est omnia

      Kommentar


      • #4
        Nur wäre dann merkwürdig, dass er noch Header senden kann.

        Da muß doch irgendeine Form von Output Buffering laufen. Mit Glück die PHP-interne ...

        Kommentar


        • #5
          Dann schick die funktion doch an ein blankes popup oder ähnliches, wenn du das html-gerüst drum herum nicht anfassen darfst, musst du die sache wohl in einem neuen fenster aufrufen...

          EDIT:
          dumm gedacht und einen teil weggelöscht
          **********
          arkos
          **********

          Kommentar


          • #6
            *Vermerk:*

            Nach genauerer Analyse des Dramas (Tut mir leid bin vorher zu schnell drübergeflogen) merke ich:

            Der Header steht nicht in den echos. Deshalb sieht man auch die CSS Einträge.... Den die wurden per:

            PHP-Code:
            <? include 'include/stylesheet.php'; ?>
            eingefügt. In diesem stylesheet steht dann einfach der

            PHP-Code:
            <style type="text/css">    <!-- 
            Befehl gefolgt von den Definitionen.

            EDIT:

            @arkos

            Ja auf die Idee bin ich auch schon gekommen. Wird wohl das beste sein, aber wenig elegant. Ich hatte gehofft die Datei einfach per Knopfdruck runterladen zu können ohne das Tool großartig verlassen zu müssen. Bei ner Blank Page muss der User die dann halt wieder schliessen. Naja.

            Dankeschön!
            Zuletzt geändert von EnCry; 08.06.2006, 13:36.
            Nec scire fas est omnia

            Kommentar


            • #7
              oder du generierst eine temporäre textdatei und gibst nur den link (target new) zu dieser aus. per cronjob o.ä. lässte du das verzeichnis mit den temp-datei regelmäßig löschen...

              somit bietest du die log als download an, was ich eleganter fänd.
              **********
              arkos
              **********

              Kommentar


              • #8
                Oh! Ja das hat was (warum übersehe ich immer die logisch am einfachsten Dinge *seufz*).

                *gleich mal umsetzen*
                Nec scire fas est omnia

                Kommentar


                • #9
                  Original geschrieben von EnCry
                  Ich hatte gehofft die Datei einfach per Knopfdruck runterladen zu können ohne das Tool großartig verlassen zu müssen.
                  Kannst du doch genauso gut, wenn du auf ein extra Downloadscript verlinkst ...
                  I don't believe in rebirth. Actually, I never did in my whole lives.

                  Kommentar


                  • #10
                    Das ist richtig ja. Aber da ich einen Methoden Aufruf für ein lokales Objekt einer PhP Klasse schlecht in einen neuen Script basteln kann ha b ich das noch nicht hinbekommen.

                    Klar ich könnte den Code einfach in ein neues Script packen und dann darauf linken aber das will ich ja eben nicht.

                    Zugegeben ich bin ein alter OO Anhänger und in PhP geht vieles nicht was ich sonst alltäglich nutze (oder kann man PhP Objekte über POST übergeben? Das wäre auch ne Möglichkeit).

                    Wenn ich dich falsch verstanden haben sollte, dann streich das Gefassel von mir wieder *grins*
                    Nec scire fas est omnia

                    Kommentar


                    • #11
                      Ich wundere mich immernoch, dass du so mirnichtsdirnichts Header senden kannst ...

                      Kommentar


                      • #12
                        Ich kann dir versprechen: Wenn du den Code siehst, mit dem ich hier "arbeite", dann wundert dich gar nichts mehr.

                        "Kraut und Rüben" beschreibt es ganz gut.

                        Aber ich ändere nichts daran. Ich füge mich dem Schicksal und schüttle den Kopf *zwinker*
                        Nec scire fas est omnia

                        Kommentar


                        • #13
                          Ich dachte ja nur ...
                          PHP-Code:
                          while (ob_get_level()) ob_end_clean(); 
                          ... zu Beginn deiner Funktion und du könntest genau das machen, was du ursprünglich wolltest.

                          Kommentar


                          • #14
                            Hmm. Dann sag das doch *grins*

                            *wieder ans ausprobieren geht*
                            Nec scire fas est omnia

                            Kommentar

                            Lädt...
                            X