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:(