2012-06-12 16 views
10

Quiero ocultar la ubicación de la carpeta de descarga para que cuando el usuario descargue un archivo no pueda ver la ubicación. Creo que esto se puede hacer usando un archivo .htaccess, pero ¿cómo hago esto? Alternativamente, ¿cómo se puede hacer esto con PHP?cómo ocultar la ubicación de la carpeta de descarga real

+0

No, no puedes. Esto es algo básico para que el usuario haga lo que quiera con el archivo que está descargando. – yent

+0

Creo que quiere decir cómo ocultar la URL del script de descarga – michael

+0

@yent en realidad solo quiero ocultar la ubicación del usuario donde existe el archivo –

Respuesta

24

Esta es la forma en que lo hago en PHP:

<?php 
$fakeFileName= "fakeFileName.zip"; 
$realFileName = "realFileName.zip"; 

$file = "downloadFolder/".$realFileName; 
$fp = fopen($file, 'rb'); 

header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=$fakeFileName"); 
header("Content-Length: " . filesize($file)); 
fpassthru($fp); 
?> 

Además, si no quiero que nadie tenga acceso a la ubicación del archivo, coloque un archivo llamado .htaccess en la carpeta de descarga con sólo el contenido :

deny from all 

He cambiado el código un poco. Primero, cuando digo nombre de archivo falso y nombre de archivo real, el nombre de archivo falso es el nombre con el que el programa de descarga descargará el archivo, donde el nombre real es el nombre del archivo real en la carpeta de descarga de su servidor.

Además, verifico para asegurarme de que el usuario haya iniciado sesión y pueda descargar el archivo. Si se opta por descargar el archivo, un archivo PHP que se llama en una nueva pestaña (con el código de descarga de la anterior), y luego al final del archivo que tengo la línea:

exit; 

Así que cuando se hace clic en el enlace de descarga, una página en blanco aparece rápidamente en una nueva pestaña, luego sale rápidamente y comienza la descarga.

EDIT: enlace La descarga se ve algo como esto:

<a href="simpleDown.php?id=<?php echo $_GET['id']; ?>" target="_blank">Download!</a> 

Dónde id es el id de la descarga en la base de datos, y en el script descarga desde arriba encuentro la entrada con ese id, luego obtenga su nombre de archivo real y el nombre de archivo falso. Sin embargo, puedes hacer esto sin la base de datos.

+1

'.htaccess' ** not **' .htacess' (al menos con la configuración predeterminada) – Lix

+0

oh mi malo, jaja, solucionado – iedoc

+0

@iedoc pero, ¿cómo puedo cambiar el dominio de descarga de url. – Kumar

4

Quizás le interese examinar Mod Rewrite o usar su script PHP para poder acceder al archivo simplemente yendo a file.php?f=someHash y luego usar una secuencia de octetos para obligar al usuario a descargar el archivo.

+2

+1 - Esta sería la solución ideal. Pasar todas las descargas a través de un script PHP no solo significa que puede mover el directorio de datos fuera de la raíz pública, sino que también puede colocar controles de seguridad en la parte superior. Lo ideal es que tampoco haga referencia a los archivos por nombre de archivo; utilice una ID que se correlacione con el archivo para que el nombre pueda modificarse a voluntad sin romper los enlaces existentes. – michael

2

Lo que vas a querer hacer es hacer que el usuario se dirija a fake_url.php y luego volver a escribir esa URL en un archivo diferente - real_url.php. Esto efectivamente muestra el real_url.php como oculto porque el usuario desconoce la redirección que ocurre en su archivo .htaccess.

RewriteRule fake_url.php(.*)$ real_url.php?$1 [L,QSA] 

En su real_url.php, puede leer los parámetros que se pasan a través de la redirección y luego usar algo similar a readFile() para enviar el archivo correspondiente al usuario desde dentro real_url.php

De modo que el usuario sólo verá la URL -
https://my-secret-site/download.php?file=file_to_download

Y en su real_url.php sabrá qué archivo se solicitó al inspeccionar el parámetro $_GET['file'].

La ubicación real de los archivos que el usuario está descargando ya no importa. Todas las descargas pasan por fake_url.php y solo esa secuencia de comandos necesita conocer la ubicación real de la carpeta de descargas.

-1

Creo que la parte principal es "escribir en .htaccess", que se puede hacer simplemente con fwrite, pero esta solución no funcionará si le está dando al usuario, una opción de lectura en línea del pdf porque en este caso el socket hay que abrir más tiempo (de alguna manera, si usted hace esto, entonces esto puede poner en peligro su seguridad!),

<?php 
session_start(); 
$fileLocation = getenv("DOCUMENT_ROOT") . "your_download _folder/.htaccess"; 
$file = fopen($fileLocation,"w"); 
$k="\.(md|htaccess)$"; 
$content = "IndexIgnore * 
Order Deny,Allow 
Deny from All 

AddType application/octet-stream .pdf"; 
fwrite($file,$content); 
fclose($file); 
$p=getenv("DOCUMENT_ROOT") . "your_download _folder/".$_SESSION['x'](file_to_be_downloaded !); 
header("Content-type:application/pdf"); 
header("Content-Disposition:attachment;filename=".$_SESSION['x']); 
readfile($p); 
$fileLocation = getenv("DOCUMENT_ROOT") . "your_download _folder/.htaccess"; 
$file = fopen($fileLocation,"w"); 
$k="\.(md|htaccess)$"; 
$content = "IndexIgnore * 
Order Allow,Deny 
Deny from All 

AddType application/octet-stream .pdf"; 
fwrite($file,$content); 
fclose($file); 
exit; 
?> 

Resultado: en la siguiente ventana (que se cerró en el momento siguiente), una la opción de descarga de archivos se activará para el usuario.

Cuestiones relacionadas