Как сделать временную ссылку для скачивания файла

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

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

Ex.

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

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

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

Ex.

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

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

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

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

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

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

5 ответов


используйте такой код

 $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? [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']);

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

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

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

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

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

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