"Christoffer" <christoffer@buur.info> writes:
> > Vil du vaere interesseret i at programmere det selv? Så kan jeg nemlig
> > godt give dig et par hints.
> Er ude efter et lignende system selv, vil du ligge et par hints her på
> usenet?
Lad os forestille os at du har følgende katalogstruktur:
./files/
./public_html/download.php
./public_html/list_files.php
For at beskytte downloads således at der kun kan downloades fra vores egen
side, skriver vi en session-variabel:
$_SESSION['can_download'] = true;
I download.php laver vi først en kontrol på om vores session-variabel findes
og er true. Hvis den er det, kan vi begynde download. Da vi ikke har filerne
liggende indenfor web-virkefeltet, benytter vi readfile() til at hente dem.
Dog skal vi lige huske at udskrive korrekt Content-Type, saaledes at
browseren kan fortolke hvad den vil goere med filen:
header("Content-Type: ".mime_content_type($filename));
readfile($filename);
exit;
Dog er det ret vigtigt at holde styr på at filen man forespoerger findes i
../files/ og ikke fx. er ../../../etc/passwd o.lign. Det plejer jeg at gøre
ved at køre en realpath() på mit færdige absolutte filnavn og kontrollere
at den absolutte sti til ./files/ er et praefiks.
For at holde styr på hvormange der har hentet en given fil, kan vi lave en
lille database:
CREATE TABLE downloads (
filename CHAR(32) NOT NULL,
count INT UNSIGNED NOT NULL,
PRIMARY KEY(filename)
);
Før vi sender filen til browseren (readfile()) sørger vi så for at opdatere
databasen:
SELECT COUNT(1) FROM downloads WHERE filename = ?
Hvis resultatet er 1:
UPDATE downloads SET count = count + 1 WHERE filename = ?
Ellers:
INSERT INTO downloads (filename, count) VALUES (?, 1)
I list_files.php kan vaerdien saa hentes ud med:
SELECT count FROM downloads WHERE filename = ?
Giver det mening?
> > Christian Jørgensen | Never make any mistaeks.
> Går ud fra du mener mistakes.
(Det var joken ;-P)
--
Christian Jørgensen | Use the Source, Luke!
http://www.razor.dk |