2012-09-25 14 views
8

estoy haciendo un proyecto de enlace de descarga temporal para mí para proteger el archivo de hotlinkers ...Cómo hacer enlace temporal por un archivo descargable

yo creo que esto es posible hacerlo porque .. todos saben que muchos de los sitios para compartir archivos "no quieren mencionar ningún" ... su enlace para el archivo tiene vencimiento ...

Ej.

Si descargo un archivo de su sitio, dan un enlace directo para hacer clic en ¿verdad? pero luego ese enlace caducará justo después de unas pocas horas o minutos.

¿Cómo sé que el enlace ha caducado? Si copio el mismo enlace en mi administrador de descargas después de un día, no puede descargar el mismo archivo.

Ya lo hice posible en htaccess.

Ej.

RewriteRule .*\.(rar|ZIP)$ http://domain.com [R,NC] 

si se copia el enlace directo en la barra de direcciones del navegador será redirigido en http://domain.com

Pero entonces, si se copia el enlace directo en su gestor de descargas el archivo se descargará.

Qué sucede si publican el enlace en cualquier otro sitio como foro, blog, etc., y le piden al lector que copie y pegue el enlace en su administrador de descargas para que puedan descargarlo directamente.

Este es el problema que deseo evitar para proteger mi archivo. Estoy haciendo esto en PHP pero no puedo resolverlo ...

Le agradecemos mucho su ayuda.

Respuesta

1

Usar un código como éste

$path="uploads/"; 
        $actualfilename=$path.$filename; 
        $fakefilename="downloadfile.pdf"; 
        if($typeofview=="download") { 
          @readfile($actualfilename); 
         header('Content-type: application/pdf'); 
         header('Content-Disposition: attachment; filename="' . $fakefilename . '"'); 
         header('Content-Transfer-Encoding: binary'); 
         header('Content-Length: ' . filesize($actualfilename)); 
         header('Accept-Ranges: bytes'); 
         exit; 

añadir esto a su.htaccess

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule fakefile.php(.*)$ orignalfile.php?$1 [L,QSA] 
+0

a probar esto uno muchas gracias. – Vhanjan

+0

No debe usar .htaccess para esto ya que se volverá imposible de mantener ya que tiene más archivos y diferentes ubicaciones. – dogmatic69

0

La solución que viene a la mente es la siguiente: Si tiene mesa, que representan el archivo y, por ejemplo FileModel puede guardar allí el nombre del archivo, algunos detalles, tamaño, también camino a la presentar en el sistema de archivos y único, que puede ser resultado de MD5 de algunos de los datos que elija para que la base de algunos detalles del archivo, por ejemplo:

$data[FileModel]['unique'] = md5(time() . $data[FileModel]['file']); 

Cada vez antes de dejar que alguien descargue su archivo que comprueba si hay tal valor único en su tabla, si es así, permita que alguien lo descargue con su método downloadFile creado en FileModel, pero justo antes de que haga único y nuevo para evitar que surjan más descargas

$data[FileModel]['unique'] = md5(time() . $data[$this -> name]['file']); 
$this -> FileModel-> save($data[$this -> name]); 
$this -> FileModel -> downloadFile($data[$this -> name]); 

Si no hay tal valor único en ur base de datos a continuación, que acaba de mostrar un error acerca de enlace timeouted al usuario

$this -> setFlashError('link expired'); 

aquí me PASE para usted un ejemplo prototipo de acción que se puede empezar con en su controlador:

function download($file_data = ''){ 
     $data = $this->FileModel->find('first', array('conditions' => array('FileModel.unique' => $file), 'fields' => array('*'))); 

     if(!is_array($data[FileModel])) $this -> setFlashError('link expired'); 

     else 
     { 
      $data[FileModel]['unique'] = md5(time() . $data[$this -> name]['file']); 
      $this -> FileModel-> save($data[$this -> name]); 
      if(!$this -> FileModel -> downloadFile($data[$this -> name])) 
      { 
       $this -> setFlashError('error')); 
      } 
     } 
} 

también se puede crear un campo de fecha y hora donde se puede por ejemplo añadir al menos 1 día para dat actual e y compruebe si el tiempo restante para descargarlo expiró.

21

Enlace a algo así como /downloads/abb76b3acbd954a05bea357144d614b4, donde abb ... es una cadena aleatoria como un hash salado de la hora actual. Cuando crea este enlace para alguien, almacene la cadena aleatoria en una tabla de base de datos. Esta tabla podría ser:

+----+-------------+----------------------------------+---------------------+---------------------+ 
| id | filename | token       | created    | modified   | 
+----+-------------+----------------------------------+---------------------+---------------------+ 
| 1 | image.jpg | abb76b3acbd954a05bea357144d614b4 | 2012-03-26 19:36:41 | 2012-03-26 19:36:41 | 
| 2 | program.exe | 19660d0f5e0ca3d42e1718de5d0a1d7e | 2012-08-29 11:07:58 | 2012-08-29 11:07:58 | 
+----+-------------+----------------------------------+---------------------+---------------------+ 

Cuando se recibe una petición en /downloads/..., buscar la cadena aleatoria y enviar el archivo correcto. Si la marca de tiempo created es demasiado antigua, no lo haga. Use un cronjob para limpiar las filas de la tabla anterior o, lo que es menos ideal, haga esto cada vez que alguien haga una solicitud al /downloads/....

+0

Creo que es fácil y limpio, pero aún hay posibilidades de que alguien descargue el archivo. –

0

la que he encontrado:

header('Content-Type: application/force-download'); 
$filee = "your_file.txt"; 
$filesLocation = dirname(__file__).'/the_sub_folder_for_the_file/'.$filee; 
header('Content-Length:' . filesize($filesLocation)); 
header("Content-Disposition: inline; filename=\"".$filee."\""); 
$filesPointer = fopen($filesLocation,"rb"); 
fpassthru($filesPointer); 
0

sé esta vieja pregunta, pero no tengo manera de descargar el archivo de sólo 1 hora y sin base de datos de uso, de forma rápida :)

if(isset($_GET['file']) && file_exists($_GET['file'])) 
{ 
    $oldName = $_GET['file']; 
    $newName = md5(time()).".txt"; 

    if(rename($oldName, $newName)) { // rename file to download just once 
     downloadFile($newName); // download file function 
    } else { 
     echo 'this file is not exist'; 
    } 
} 
Cuestiones relacionadas