downloads bijhouden (mobiel)
Ik heb een .apk bestandje op mijn webserver, maar nu wil ik bijhouden, hoevaak die is gedownload, nu had ik het volgende script:
download.php
Dit bestand wordt aangeroepen door middel van een hyperlink.
En dit werkt prima, geen enkel probleem.
Maar zodra ik op mijn telefoon op deze hyperlink klik, dan wordt er wel een rij toegevoegd in de database, maar hij download het bestand niet.
Werkt dit voor mobiele (android) apparaten soms anders?
download.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
include('db.php');
$file = 'simsonagenda.apk';
if(file_exists($file)) {
mysql_query("INSERT INTO sim_downloads (ip) VALUES ('".$_SERVER['REMOTE_ADDR']."')")or die(mysql_error());
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
}
echo 'Laden...';
?>
include('db.php');
$file = 'simsonagenda.apk';
if(file_exists($file)) {
mysql_query("INSERT INTO sim_downloads (ip) VALUES ('".$_SERVER['REMOTE_ADDR']."')")or die(mysql_error());
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
}
echo 'Laden...';
?>
Dit bestand wordt aangeroepen door middel van een hyperlink.
En dit werkt prima, geen enkel probleem.
Maar zodra ik op mijn telefoon op deze hyperlink klik, dan wordt er wel een rij toegevoegd in de database, maar hij download het bestand niet.
Werkt dit voor mobiele (android) apparaten soms anders?
ik zou dat echo 'Laden...'; er even uithalen.
Frank Nietbelangrijk op 02/03/2013 10:08:06:
ik zou dat echo 'Laden...'; er even uithalen.
Gedaan, maar heeft geen zin.
Haal die echo eens weg. Je moet NOOIT andere content naar de browser versturen als je een download aanbiedt. Alleen de juiste headers en het bestand.
Edit: te laat, maar doe het in elk geval niet, want het kan bij veel files wel problemen geven
Toevoeging op 02/03/2013 10:19:48:
Wat ik me wel afvraag is waar je eigenlijk de file verstuurt naar de browser. Zoals ik het nu bekijk verstuur je alleen de headers...
Edit: te laat, maar doe het in elk geval niet, want het kan bij veel files wel problemen geven
Toevoeging op 02/03/2013 10:19:48:
Wat ik me wel afvraag is waar je eigenlijk de file verstuurt naar de browser. Zoals ik het nu bekijk verstuur je alleen de headers...
Gewijzigd op 02/03/2013 10:12:06 door Erwin H
Erwin H op 02/03/2013 10:11:20:
Dan lukt het nog niet als je de outputbuffer leegt met ob_clean() op regel 14 voor de flush() op regel 15.Wat ik me wel afvraag is waar je eigenlijk de file verstuurt naar de browser. Zoals ik het nu bekijk verstuur je alleen de headers...
Precies, volgens mij wordt dat bestand dus helemaal niet verstuurd. Ik vraag me dus ook af wat 'prima' hier precies inhoudt. Krijg je op je eigen pc dat bestand wel aangeboden?
Tom Tom op 02/03/2013 10:05:15:
En dit werkt prima, geen enkel probleem.
Ik mis dus een readfile()...
@Erwin H, op mijn computer werkte dit wel.
Ik heb nu maar besloten om het gewoon makkelijk te houden.
<a href="download.php" target="_blank">
Ik heb nu maar besloten om het gewoon makkelijk te houden.
<a href="download.php" target="_blank">
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
include('db.php');
$file = 'simsonagenda.apk';
if(file_exists($file)) {
mysql_query("INSERT INTO sim_downloads (ip) VALUES ('".$_SERVER['REMOTE_ADDR']."')")or die(mysql_error());
header('Location: simsonagenda.apk') ;
exit;
}
?>
include('db.php');
$file = 'simsonagenda.apk';
if(file_exists($file)) {
mysql_query("INSERT INTO sim_downloads (ip) VALUES ('".$_SERVER['REMOTE_ADDR']."')")or die(mysql_error());
header('Location: simsonagenda.apk') ;
exit;
}
?>
Tom Tom op 02/03/2013 10:50:20:
@Erwin H, op mijn computer werkte dit wel.
Ik heb moeite om dat te geloven.... ik heb eerder het idee dat je dan elke keer naar de file gaat die er al stond... Anyway, als jij denkt dat het werkt, werkt het.
Nu doe je een redirect naar dat bestand... op zich niet erg maar toch een nieuwe pagina die geladen moet worden. Bovendien laat je het nu aan de browser van de gebruiker over wat te doen met dat bestand. Dus downloaden en opslaan of (proberen) weer te geven. Overigens zegt de extensie .apk mij persoonlijk niets.
Als je wilt dat het bestand wordt gedownload:
Als je wilt dat het bestand wordt gedownload:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
include('db.php');
$file = 'simsonagenda.apk';
if(file_exists($file)) {
mysql_query("INSERT INTO sim_downloads (ip) VALUES ('".$_SERVER['REMOTE_ADDR']."')")or die(mysql_error());
header('Content-disposition: attachment; filename='.$file);
header('Content-type: application/apk');
readfile($file);
exit;
}
?>
include('db.php');
$file = 'simsonagenda.apk';
if(file_exists($file)) {
mysql_query("INSERT INTO sim_downloads (ip) VALUES ('".$_SERVER['REMOTE_ADDR']."')")or die(mysql_error());
header('Content-disposition: attachment; filename='.$file);
header('Content-type: application/apk');
readfile($file);
exit;
}
?>
Ik zou wel vervangen door .




