yo hice algo muy parecido.
que me liste el contenido de un directorio que no este dentra de la carpeta del servidor, es decir, los archivos no estaban a la vista para ser descargados.
Primero cree una pagina que valida un usuario y crea un inicio de sesion
codigo del index.php
Código HTML:
<?php
session_start(); // retoma una session que exista y si no la crea...
session_unset(); // Elimina las cookies y valores de variables que puedan existir
session_destroy(); // destruye la session que pueda existir
?>
<html>
<body>
<form action="valida.php" method="post" name="form1">
<table width="18%" border="0">
<tr>
<td width="14%" align="right">Usuario</td>
<td width="2%"> </td>
<td width="84%"><input name="user" type="text" size="15"></td>
</tr>
<tr>
<td height="19" align="right">Contraseña</td>
<td height="19"> </td>
<td><input name="password" type="password" size="15"></td>
</tr>
<tr>
<td height="19" align="right"> </td>
<td height="19"> </td>
<td><input name="BtnAceptar" type="submit" value="Ingresar"></td>
</tr>
<tr>
<td height="19" align="right"> </td>
<td height="19"> </td>
<td> </td>
</tr>
</table>
</form>
</body>
</html>
<?php
echo "<script language='JavaScript' type='text/JavaScript'>";
echo "document.form1.user.focus()";
echo "</script>";
?>
en la pagina valida.php tengo usuarios y claves que son fijas, pero ustedes la pueden conectar a una BD y validar al usuario , es facil ;D
valida.php
Código PHP:
<?
session_start();
$user = $_POST["user"];
$pass = $_POST["pass"];
if($user==".php" and $pass=="123456" or $user=="x2" and $pass=="123"){
$_SESSION["user"] = $user;
$_SESSION["path"] = "/home/Descargas/";
echo "<script language='javascript'>window.top.location='./listar.php'</script>";
}elseif($user=="x1" and $pass=="123456" ){
$_SESSION["user"] = $user;
$_SESSION["path"] = "/home/x1/";
echo "<script language='javascript'>window.top.location='./listar.php'</script>";
}else{
echo "<script language='javascript'>window.top.location='./index.php'</script>";
}
?>
y en listar lo que hago muestro el contenido y genero la descarga obligatoria de la misma pagina.
listar.php
Código PHP:
<?
session_start();
if (isset($_SESSION["user"])){
$name = base64_decode($_GET["id"]);
$name = base64_decode($name);
$aTmp = explode("-",$name);
if ($aTmp[0]=="descargas"){
$enlace = $_SESSION["path"]."$aTmp[1]";
header ("Content-Disposition: attachment; filename=".$aTmp[1]."\n\n");
header ("Content-Type: application/octet-stream");
header ("Content-Length: ".filesize($enlace));
readfile($enlace);
exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" >
<link href="./style.css" rel="stylesheet" type="text/css">
<body>
<ul id="botones">
<?
while ($archivo = $directorio->read()) {
$aux = base64_encode("descargas-".$archivo);
for($i=0;$i<=9;$i++){
$id=base64_encode($aux);
}
print("<li>\n
<div align=\"center\"><a href=\"?id=$id\"><span class=\"TexFil\">$archivo</span></a></div>\n
</li>\n");
}
$directorio->close();
}else{
echo "<script language='javascript'>window.top.location='../index.php'</script>";
}
?>
</ul>
</p>
</body>
</html>
si tienen, este metodo para realizar descargas es buenisimo, asi no te roban la url por que aunque la tengan no van a poder descargar si no iniciaron sesion