Как сделать временную ссылку для загружаемого файла

Я делаю проект для временной ссылки для загрузки для защиты файла от hotlinkers …

Я считаю, что это возможно … потому что мы все знаем, что многие сайты для обмена файлами « не хочу упоминать о каких-либо » … их ссылка на файл имеет срок действия …

Ex.

Если я загружаю один файл со своего сайта, он дает прямую ссылку, чтобы щелкнуть его правильно? но тогда эта ссылка истекает сразу после нескольких часов или минут.

Как узнать, что срок действия ссылки истек? Если я копирую одну и ту же ссылку в диспетчере загрузки через один день, она не может загрузить тот же файл.

Я уже сделал это возможным в htaccess .

Ex.

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

если они скопируют прямую ссылку в адресной строке браузера, они будут перенаправлены в http://domain.com

Но если они скопируют прямую ссылку в менеджере загрузки, файл будет загружен.

Что делать, если они публикуют ссылку на любой другой сайт, такой как форум, блог и т. Д., И попросите читателя скопировать и вставить ссылку в свой менеджер загрузок, чтобы они могли скачать ее напрямую.

Это проблема, которую я хочу предотвратить для защиты моего файла. Я делаю это на PHP, но я не могу понять это …

Ваша помощь очень ценится.

Используйте такой код, как это

  $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; 

добавьте это в ваш .htaccess файл

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

Ссылка на что-то вроде /downloads/abb76b3acbd954a05bea357144d614b4 , где abb … является случайной строкой, такой как соленый хеш текущего времени. Когда вы сделаете эту ссылку для кого-то, сохраните случайную строку в таблице базы данных. Эта таблица может выглядеть так:

 +----+-------------+----------------------------------+---------------------+---------------------+ | 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 | +----+-------------+----------------------------------+---------------------+---------------------+ 

Когда вы получите запрос на /downloads/... , найдите случайную строку и отправьте правильный файл. Если created временная метка слишком старая, не делайте этого. Используйте cronjob для очистки старых строк таблицы или, что менее идеально, делать это каждый раз, когда кто-то делает запрос /downloads/...

Решение, которое приходит мне на ум, выглядит следующим образом: если у вас есть таблица, которая представляет файл и, например, FileModel, вы можете сохранить там имя файла, некоторые детали, размер, а также путь к файлу в вашей файловой системе и уникальный, который может быть результатом md5 из некоторых данных, которые вы выбираете для него, на основе некоторых данных файла, например:

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

Каждый раз, прежде чем позволить кому-то загрузить ваш файл, вы проверяете, есть ли в вашей таблице такое уникальное значение, если вы позволили кому-то загрузить его с помощью метода downloadFile ur, созданного в FileModel, но перед этим вы делаете новый уникальный, чтобы не допустить загрузки

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

Если в базе данных ur нет такого уникального значения, вы просто показываете ошибку о тайм-ауту ссылки на пользователя

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

Здесь я pase для вас пример прототипа действия, с которым вы можете начать с вашего контроллера:

 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')); } } } 

Также вы можете создать поле datetime, где вы можете, например, добавить 1 день к текущей дате и проверить время, оставшееся до загрузки, истекло.

тот, который я нашел:

 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); 

Я знаю этот старый вопрос, но у меня есть способ загрузить файл всего 1 раз без использования базы данных, быстрый способ 🙂

 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'; } }