温度。下载链接(带codeigniter)

时间:2010-06-05 22:18:36

标签: php codeigniter download hyperlink

我想知道如何根据受保护目录(例如/ downloads /)中的文件开始生成临时下载链接。这些链接必须有效,直到有人使用它5次左右或大约一周后,此后链接不再可访问。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

如果您使用apache(或轻松),我最近偶然发现的一个聪明的解决方案是使用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将传递该文件。

这消除了处理mimetypes,chunking和其他标题的所有痛苦。

答案 1 :(得分:0)

使用数据库。每次下载文件时,数据库都会更新,只要某个文件达到它的限制,就可以删除它,也可以拒绝它的访问。例如:

$data = $this->some_model->get_file_info($id_of_current_file);
if ( $data->max_downloads <= 5 )
{
    // Allow access to the file
}

答案 2 :(得分:0)

我通常将文件保留在网站目录结构之外,以确保安全性和请求:

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

为此添加字节/请求计数将非常简单。