Letöltés számláló
Helló!
A segítségeteket szeretném kérni a következőben:
Készítettem egy php script-et, amivel fájlokat lehet letölteni. Szeretnék bele egy olyat tenni, hogy számolja, hányszor töltötték le az adott fájl. Ezt mind sikerült is megcsinálno, azonban ha egy letöltés megszakad, azt is beleszámolja, én viszont olyat szeretnék, hogy csak a teljesen befejezett letöltések legyenek számlálva. Próbálkoztam a connection_aborted() függvénnel, mint az alábbi kódban látható, de mégse működik helyesen.
■ A segítségeteket szeretném kérni a következőben:
Készítettem egy php script-et, amivel fájlokat lehet letölteni. Szeretnék bele egy olyat tenni, hogy számolja, hányszor töltötték le az adott fájl. Ezt mind sikerült is megcsinálno, azonban ha egy letöltés megszakad, azt is beleszámolja, én viszont olyat szeretnék, hogy csak a teljesen befejezett letöltések legyenek számlálva. Próbálkoztam a connection_aborted() függvénnel, mint az alábbi kódban látható, de mégse működik helyesen.
<?php
ignore_user_abort(TRUE);
set_time_limit(0);
require_once('../functions.php'); // mysql_encode és mysql_decode függvényeket tartalmazza
$sql = @mysql_connect('localhost', '***', '***');
@mysql_select_db('***');
@mysql_query("SET NAMES 'latin2'");
// van-e ilyen letölthető fájl
$query = "SELECT download_file FROM downloads WHERE download_file = '".mysql_encode($_GET['file'],$sql)."'";
$result = mysql_query($query);
if (mysql_num_rows($result) !== 1)
die("The requested file could not be found");
$row = mysql_fetch_row($result);
@mysql_free_result($result);
$filename = realpath(mysql_decode($row[0]));
// nem lehet php kiterjesztésű
if(strToLower(substr($filename,strlen($filename)-3, 3) == 'php')) {
die( "The requested file cannot be retrieved for security reasons.");
}
// A fájl nem található
if(!file_exists($filename)) {
die("The requested file could not be found");
}
// required for IE, otherwise Content-disposition is ignored
if(ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off'); }
// ne legyen cache-selve
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
// fájl típusa
$ext = strToLower(substr($filename,strlen($filename)-3, 3));
if ($ext == "mp3" ) { header("Content-Type: audio/x-mp3"); }
else if ($ext == "jpg") { header("Content-Type: image/jpeg"); }
else if ($ext == "gif") { header("Content-Type: image/gif"); }
else if ($ext == "png") { header("Content-Type: image/png"); }
else if ($ext == "swf") { header("Content-Type: application/x-shockwave-flash"); }
else if ($ext == "flv") { header("Content-Type: video/flv"); }
// fájllal kapcsolatos fejlécek
header("Accept-Ranges: bytes");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
// fájlbeolvavása és kiküldése
$fp = fopen($filename, 'rb');
while (!feof($fp) && !connection_aborted()) {
echo fread($fp, 1024);
flush();
if (connection_aborted()) {
fclose($fp);
die();
}
}
fclose($fp);
// loggolás
if (!connection_aborted()) {
$query = "UPDATE downloads SET download_counter = download_counter + 1 WHERE download_file = '".mysql_encode($_GET['file'],$sql)."'";
mysql_query($query);
}
?>
Warningok?
Warningok?
Ahogy próbálkoztam tovább azt vettem észre, hogy mikor a linkre kattintok, bejön ugyebár egy ablak, hogy menteni szeretném-e a fájlt, vagy megnyitni (FF-ben és IE-ben is). És ezalatt belekukkantok a mysqlbe, akkor látom, hogy már növelte is a számláló értékét eggyel. Pedig valójában még meg sem kezdőtött a letöltés.
A letöltés már elkezdődött
Viszont: Ha a fájl kicsi a letöltés befejeződhet még a "Save As..." dialógusablak alatt. Ilyenkor ha cancel-t nyomsz a böngésző kidobja a már letöltött adatokat (ezesetben az egész fájlt). A usernek úgy tűnhet, hogy nem töltött le semmit, valójában már az egész fájlt letöltötte és törölte is.
A letöltés már elkezdődött
...
Szerintem nem hazsnálna
Esetleg érdemes lenne csinálni egy egyszerű példát. Biztos van a php manuálban valami. Ha az működik, akkor lehet közelíteni a kettőt...
Assz'em a safe
Az alapbeállitás esetén viszont a script is leállna ilyenkor...