Browserfenster nach POST leeren bzw. Text ausgeben

Alles, was PHP betrifft, kann hier besprochen werden.

Browserfenster nach POST leeren bzw. Text ausgeben

Postby spacewalker » 01. August 2013 13:27

Hallo,

ich habe ein PHP Skript, das wie folgt aufgerufen wird:
http://server/login.php?f=test.pdf

Damit soll die Datei "test.pdf" zum Client übertragen werden - allerdings muss zuvor ein Passwort eingegeben werden.
Für die Passwortanfrage wird vom PHP Skript ein Formular erzeugt.
Das klappt auch alles...das Passwort wird überprüft und der Download funktioniert auch.

Ich möchte aber nach dem Download eine Meldung an den Browser senden, z.B "Download war erfolgreich" (oder eventuell auch noch ein paar Informationen über den Download, z.B Dauer und Anzahl Bytes....)
Ich habe die Stelle mit einem "--->" markiert:

Login.php:
Code: Select all
session_start();
$password ="AJSWJDJDJ";
$downloadverzeichnis = "d://downloads//";

if (!isset($_POST["submit"])) //das Skript wurde NICHT per "Download starten" Button aufgerufen (POST), sondern vom Browser direkt per URL (GET), z.B so : http://server/login1.php?f=test.iso
{
   
    //dateinamem aus URL auslesen (wird später beim Download dann benötigt)
    $fname = basename($_GET["f"]);
   
    //Formular zur Eingabe des Passworts anzeigen.
    //Wenn dort der Button "Download starten" geklickt wird dann wird dieses Skript aus dem Formular heraus nochmal aufgerufen (dann aber per POST)
    Formular_anzeigen($fname);

    //session_unset();     // unset $_SESSION variable for the run-time
    //session_destroy();   // destroy session data in storage
}

else                         //das Skript wurde per "Download starten" Button (submit) aufgerufen (POST)

{
    echo date("H:i:s") . " : Start skript per Button-Klick (POST) ...<p>" ;  //diese Meldung wird nie angezeigt ....
   
    if (isset($_POST['password'])) //es wurde ein Passwort vom Formular hierher übertragen - dann prüfen, ob das PW korrekt ist
    {
     
        if (sha1($_POST['password']) == $password

        {
            echo "passwort war OK";    //diese Meldung wird nie angezeigt...schade eigentlich.

            //Datei an den Client senden
            Download_starten($downloadverzeichnis . $fname);
           
--->        //hier ist mein Problem : wie kann ich hier nach dem Download einen Text zum Browser senden, z.b einfach nur "Download war erfolgreich"
        //am besten wäre es wenn dabei das Formular mit der Passworteingabe aus dem Browser verschwinden würde, so dass der Browser nur den Text anzeigt.
            //
        //ein paar Experimente, die nichts gebracht haben:
        //echo "Download war erfolgreich";
        //flush();
        //ob_flush();
                
             //session_unset();     
             //session_destroy();   
               
        }
        else
        {
            die ('falsches Passwort');
        }
    }
   
   
}



Die Formular Routine sieht so aus:
Code: Select all
function formular_anzeigen($fname)
{
 ?>
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        <html>
        <head>
        <!-- <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> !-->
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Download Datei</title>
        </head>
        <body>
        <p>Sie wollen folgende Datei runterladen:</p>
        <?php
        echo $fname . "<br>";
        ?>   
        <p>Um diese Datei zu laden müssen Sie das Dateipasswort eingeben:</p>
        <form method="post">
        Passwort: <input type="password" name="password"> <br/>
        <input type="submit" name="submit" value="Download starten">
        </form>
        </body>
        </html>
         <?php       
     
}
 
?>




Die Download Routine sieht so aus:

Code: Select all
function Download_starten ($fullPath)
//***************************************************************************
//Funktion          : Sendet die Datei, die der Client angefordert hat, an den Browser (in Chunks)
{
 if(file_exists($fullPath))
    {
    $size = get_filesize ($fullPath);
         
      header("Pragma: public");
      header("Expires: 0");
      header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
      header("Cache-Control: private",false);
      header("Content-Type: application/force-download");
      header("Content-Type: application/octet-stream");
      header("Content-Type: application/download");
      header('Content-Disposition: attachment; filename="'.basename($fullPath).'"');
      header("Content-Description: File Transfer");
      header("Content-Transfer-Encoding: binary");
      header('Content-Length: '.$size );
       
      ob_clean();                   
     
      set_time_limit(1200);         
                                   
     
      $chunksize = 1 * (1024 * 1024);
       
      if ($size > $chunksize)
        {
              $handle = fopen($fullPath, 'rb');
              $buffer = '';
              while (!feof($handle))
              {
                $buffer = fread($handle, $chunksize);
               
                //*********************************************
                echo $buffer;   //an den Client senden
                //*********************************************
               
                ob_flush();
                flush();
              }
              fclose($handle);
        }
        else   //kleine Dateien auf einen Schlag an den Client senden
        {
            readfile($fullPath);
        }

    }
    else
    {
         session_unset();     
         session_destroy();   
         die ("Datei nicht gefunden:[" . $fullPath . "]")  ;
    }
   
}



Falls es noch sonstige Vorschläge zur Versserung des Codes gibt bin ich natürlich auch immer dankbar für Hinweise...
Heinz
spacewalker
 
Posts: 13
Joined: 25. July 2013 09:46
Operating System: Windows 2008R2

Return to PHP

Who is online

Users browsing this forum: No registered users and 20 guests