En helt anden løsning som jeg har brugt en gang, var at gemme filen på serveren på helt almindeligvis, men i en mappe som brugerne ikke lige kan regne ud eller en mappe som webserveren ikke kan få fat i.
I din database har du så et unikt id fx et MD5 hash, og så filnavnet, bruger id og størrelse på filen.
Så laver du bare et script som læser filen højt fra browseren, så kan brugeren nemlig ikke se hvor filen er på serveren, og kan kun se den PHP-fil de forespørger.
Stien til filen kunne se ud som dette:
http://side.dk/download.php?file=18430ae620ecf2b196895985f1096cabEksempel på download.php:
<?php
$mysql = new mysqli("localhost", "brugernavn", "adgangskode", "database");
// MD5 hashet på filen
$code = $mysql->real_escape_string($_GET['file']);
// Brugerens unikke ID, som har adgang til filen
$id = (int)$_SESSION['user_id'];
// Stien hvor din fil er
$path = "/var/www/files/underlig/mappe/som/er/latterligt/langt/ude/";
// Finder den fil vi leder efter
$query = $mysql->query("SELECT filename, filesize FROM files WHERE filehash = '".$code."' AND user_id = ".$id." LIMIT 1");
// Tjekker om
if($query->num_rows == 1) {
// Opdeler resultatet som objekt
$r = $query->fetch_object();
// En masse headers
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"" . $r-> filename . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $this->filesize);
readfile($path . $r->namefile);
} else {
echo "Du har ikke adgang til denne fil, dumme ko!!";
}
?>
Dette er bare lige et udkast og lidt kode fra et gammelt script, så der er sikkert nogle som kunne pege fingre af det og komme med ændringer.
Har ikke tjekket om det virker, men er bare lige skrevet som et "forslag som du kunne arbejde videre på".
Indlæg senest redigeret d. 06.07.2009 17:40 af Bruger #4265