температура ссылки для скачивания (с codeigniter) - PullRequest
1 голос
/ 06 июня 2010

Мне было интересно, как я могу начать генерировать временно загружаемые ссылки на основе файлов из защищенного каталога (например, / downloads /). Эти ссылки должны быть действительными до тех пор, пока кто-нибудь не воспользуется им 5 раз или около того или примерно через неделю, после этого ссылка больше не будет доступна.

Любая помощь будет оценена.

Ответы [ 3 ]

1 голос
/ 15 июня 2010

Одно умное решение, на которое я наткнулся в последнее время, если вы используете apache (или lighty), - это использовать mod_xsendfile (http://tn123.ath.cx/mod_xsendfile/),) модуль apache, который использует заголовок, чтобы определить, какой файл передать пользователю.

Его очень просто установить (см. Ссылку выше), а затем просто включите эти строки в файл .htaccess:

XSendFile on
XSendFileAllowAbove on

Затем в своем php-коде сделайте что-то подобное, когда вы хотите, чтобы пользователь получил файл:

header('X-Sendfile: /var/notwebroot/files/secretfile.zip')

Apache перехватит любой ответ с заголовком X-Sendfile, и вместо отправки любого содержимого, которое вы выводите (вы также можете вернуть пустую страницу), apache доставит файл.

Это снимает с себя всякую боль, связанную с миметипами, частями и разными заголовками.

0 голосов
/ 07 июня 2010

Я обычно храню файлы вне структуры каталогов веб-сайта для безопасности и запрашиваю так:

    function retrive_file($file_hash)
   {
        $this->_redirect();

    $this->db->where('file_hash', $file_hash);
    $query = $this->db->get('file_uploads');

    if($query->num_rows() > 0)
 {

        $file_info = $query->row();

        if($file_info->protect == 1){
            $this->_checklogin();
        }

        $filesize = filesize($file_info->file_path . $file_info->file_name);
        $file = fopen($file_info->file_path . $file_info->file_name, "r");

        // Generate the server headers
        if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
        {
            header('Content-Type: "application/octet-stream"');
            header('Content-Disposition: attachment; filename="'.$file_info->file_name.'"');
            header('Expires: 0');
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header("Content-Transfer-Encoding: binary");
            header('Pragma: public');
            header("Content-Length: ".$filesize);
        }
        else
        {
            header('Content-Type: "application/octet-stream"');
            header('Content-Disposition: attachment; filename="'.$file_info->file_name.'"');
            header("Content-Transfer-Encoding: binary");
            header('Expires: 0');
            header('Pragma: no-cache');
            header("Content-Length: ".$filesize);
        }

        if($file)
        {
            while(!feof($file)){
                set_time_limit(0);
                echo fread($file, $filesize);
                flush();
                ob_flush();
            }
        }
        fclose($file);
    }
}

Было бы довольно просто добавить к этому подсчет байтов / запросов.

0 голосов
/ 06 июня 2010

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

$data = $this->some_model->get_file_info($id_of_current_file);
if ( $data->max_downloads <= 5 )
{
    // Allow access to the file
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...