truesoul: Nach Downloaden ein PHP Script ausführen.

Hallo miteinander,

also ich erläuter mal genau was ich vor habe.
Zur Zeit verwende ich :

  
<a href="pfad zur Datei" >Downloaden</a>  

Nunja, wenn der User dann auf Downloaden drückt, soll der Download beginnen, was auch wunderbar klappt. Aber zum gleichen Zeitpunkt soll eine php function aufgerufen werden und einen Datenbankeintrag ändern.
Meine Versuche sind bisher alle gescheitert.

  
<form target="_self" method="post" name="main" action="pfad zur Datei">  
<input type="submit" name="zugestimmt" value="Downloaden">  
</form>		  

und der php teil:

  
if(isset($_POST['zugestimmt'])) {  
updateStatistik(0);  
}  

Ohne action="pfad zur Datei" wird der Script ausgeführt, mit allerdings nicht.

Mit Javascript hatte ich eine Lösung, was allerdings unschön ist/war.
Da habe ich ein Fenster aufgerufen mit dem Script und dieses wieder geschlossen nachdem der script ausgeführt wurde.

Achja zuvor hatte ich meine Pfade zum Download "versteckt":

  
...  
if($file_path != "")  
	{  
		$header_file  = $_GET['filename'];  
		$array = explode(".", $header_file);  
		$type = "";  
		if($array[1] == "exe")  
			$type = "application/exe";  
		elseif($array[1]  == "flv")  
			$type = "application/x-flv";  
		elseif($array[1]  == "rar")  
			$type = "application/x-rar-compressed";  
		  
		$file_real = $file_path.$header_file;  
		header("Pragma: public");  
		header("Expires: 0");  
		header("Cache-Control: must-revalidate, post-check=0, pre-check=0");  
		header("Cache-Control: public", false);  
		header("Content-Description: File Transfer");  
		header("Content-Type: ".$type );  
		header("Accept-Ranges: bytes");  
		header("Content-Disposition: attachment; filename=\"" .$header_file. "\";");  
		header("Content-Transfer-Encoding: binary");  
		header("Content-Length: " . filesize($file_real));  
		// Send file for download  
		if ($stream = fopen($file_real, 'rb')){  
			while(!feof($stream) && connection_status() == 0){  
			//reset time limit for big files  
				set_time_limit(0);  
				print(fread($stream,1024*8));  
				flush();  
			}  
			fclose($stream);  
		}  
		else{  
		// Requested file does not exist (File not found)  
			echo("Requested file does not exist");  
			die();  
		}  
	}  

im gleichen Script konnte ich somit auch den Datenbankeintrag ändern.
Seit einer Woche erhalten ich aber von diesen Script defekte Dateien, allerdings nur wenn es sich um .exe Daten handelt.

Ich hoffe ihr könnt mir bei dem Punkt helfen wie ich ein script ausführe und zum gleichen Zeitpunkt die datei laden kann.

  1. Hi,

    <a href="pfad zur Datei" >Downloaden</a>
    Nunja, wenn der User dann auf Downloaden drückt, soll der Download beginnen, was auch wunderbar klappt. Aber zum gleichen Zeitpunkt soll eine php function aufgerufen werden und einen Datenbankeintrag ändern.

    dann solltest du die Datei, die heruntergeladen wird, nicht direkt referenzieren, sondern ein PHP-Script, das
     a) die angeforderten Daten "besorgt" und durchreicht
     b) zum Schluss den gewünschten Datenbankeintrag vornimmt

    <form target="_self" method="post" name="main" action="pfad zur Datei">

    <input type="submit" name="zugestimmt" value="Downloaden">
    </form>

      
    Ein target="\_self" ist unnötig - das ist der Defaultwert (außerdem ist target missbilligt und sollte nicht mehr verwendet werden).  
      
    
    > ~~~php
    
    if(isset($_POST['zugestimmt'])) {  
    
    > updateStatistik(0);  
    > }
    
    

    Ohne action="pfad zur Datei" wird der Script ausgeführt, mit allerdings nicht.

    Huh? Wenn das action-Attribut leer ist (vorhanden, aber ein Leerstring!), erfolgt der Formularversand wieder an dieselbe URL, von der das aktuelle Dokument kam.

    Achja zuvor hatte ich meine Pfade zum Download "versteckt":

    ...

    if($file_path != "")
    {
    $header_file  = $_GET['filename'];
    $array = explode(".", $header_file);
    $type = "";
    if($array[1] == "exe")
    $type = "application/exe";
    elseif($array[1]  == "flv")
    $type = "application/x-flv";
    elseif($array[1]  == "rar")
    $type = "application/x-rar-compressed";

      $file_real = $file_path.$header_file;  
      header("Pragma: public");  
      header("Expires: 0");  
      header("Cache-Control: must-revalidate, post-check=0, pre-check=0");  
      header("Cache-Control: public", false);  
      header("Content-Description: File Transfer");  
      header("Content-Type: ".$type );  
      header("Accept-Ranges: bytes");  
      header("Content-Disposition: attachment; filename=\"" .$header_file. "\";");  
      header("Content-Transfer-Encoding: binary");  
      header("Content-Length: " . filesize($file_real));  
      // Send file for download  
      if ($stream = fopen($file_real, 'rb')){  
      	while(!feof($stream) && connection_status() == 0){  
      	//reset time limit for big files  
      		set_time_limit(0);  
      		print(fread($stream,1024*8));  
      		flush();  
      	}  
      	fclose($stream);  
      }  
      else{  
      // Requested file does not exist (File not found)  
      	echo("Requested file does not exist");  
      	die();  
      }  
    

    }

    
    >   
    > im gleichen Script konnte ich somit auch den Datenbankeintrag ändern.  
      
    Ja, das ist in etwa, was ich dir auch vorgeschlagen hätte. Allerdings würde ich darauf verzichten, den Content-Type individuell zu setzen - ich würde einfach application/octet-stream verwenden. Und im Fehlerfall solltest du anstandshalber anstatt die() einen ordnungsgemäßen "404 Not Found"-Status ausgeben.  
    Ich verstehe auch nicht, wozu du set\_time\_limit() verwendest, und das auch noch mehrfach in der Schleife. Es hilft dir nichts, weil damit nur die Script-interne Rechenzeit erfasst wird (Warten auf I/O-Operationen zählt nicht zur Scriptlaufzeit dazu), und wenn überhaupt, sollte es am Anfang des Scripts außerhalb der Schleife stehen.  
      
    
    > Seit einer Woche erhalten ich aber von diesen Script defekte Dateien, allerdings nur wenn es sich um .exe Daten handelt.  
      
    Was heißt defekt? Wie äußert sich das?  
      
    So long,  
     Martin  
    
    -- 
    Wenn Zeit das Kostbarste ist, was wir haben, dann ist Zeitverschwendung die größte aller Verschwendungen.  
      (Benjamin Franklin, amerikanischer Tüftler und Politiker)  
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
    1. hi,

      Ja, das ist in etwa, was ich dir auch vorgeschlagen hätte. Allerdings würde ich darauf verzichten, den Content-Type individuell zu setzen - ich würde einfach application/octet-stream verwenden.

      An dieser Stelle schlage ich gerne vor, solche Sachen in der Projektverwaltung festzulegen:

      • URL unter welcher es den Download gibt
      • den passenden Content-Type

      Ggf. bekommt der URL eine Dateierweiterung, damit der Browser, sofern er den Content nicht selbst darstellen kann, die Datei mit der passenden Dateierweiterung zum "Speichern Unter" anbietet.

      Hotti

      1. Hallo,

        An dieser Stelle schlage ich gerne vor, solche Sachen in der Projektverwaltung festzulegen:

        • URL unter welcher es den Download gibt
        • den passenden Content-Type

        wenn man das überhaupt möchte!

        Ggf. bekommt der URL eine Dateierweiterung, damit der Browser, sofern er den Content nicht selbst darstellen kann, die Datei mit der passenden Dateierweiterung zum "Speichern Unter" anbietet.

        Genau das bezwecke ich mit dem generischen Content-Type application/octet-stream, mit dem ich den Browser davon abhalten will, Inhalte selbst darzustellen, sondern direkt zum Speichern anzubieten. Das ist ja in der Regel das Ziel, wenn man schon konkret von einem "Download" spricht.

        Ciao,
         Martin

        --
        Wenn der Computer wirklich alles kann,
        dann kann er mich mal kreuzweise.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Danke für deine Hilfe Martin. Habe jetzt den Content_Type geändert, und klappt wie gewohnt. Die Exe Datei war nicht installierbar bzw ausführbar.

          Ich bin nicht so erfahren mit der Scriptsprache PHP und mir war nicht bewusst das :

            
          while(!feof($stream) && connection_status() == 0){  
          //reset time limit for big files  
             set_time_limit(0);  
             print(fread($stream,1024*8));  
             flush();  
          }  
          
          

          "falsch" ist.
          Wie wäre der teil den Sinnvoller einzusetzen als diese Variante. Das set_time_limit() ausserhalb sinnvoller ist, leuchtet ein :)

          Gruß Markus

        2. Hallo,

          An dieser Stelle schlage ich gerne vor, solche Sachen in der Projektverwaltung festzulegen:

          • URL unter welcher es den Download gibt
          • den passenden Content-Type

          wenn man das überhaupt möchte!

          Natürlich möchte er. So oder so.

          Genau das bezwecke ich mit dem generischen Content-Type application/octet-stream, mit dem ich den Browser davon abhalten will, Inhalte selbst darzustellen, sondern direkt zum Speichern anzubieten.

          Das wird in der Projektverwaltung notiert und gut isses.

          Hotti

  2. hi,

    Ich hoffe ihr könnt mir bei dem Punkt helfen wie ich ein script ausführe und zum gleichen Zeitpunkt die datei laden kann.

    Das kann alles in einem Script erledigt werden:
    1 das Script erzeugt die Seite mit den Links
    2 das Script erzeugt den Header mit dem richtigen Content-Type und den Inhalt zum Download bei einem Klick auf den Link
    3 das Script schreibt die Statistik bei 2

    Hotti