如何增加用户的每日下载限制?

时间:2019-04-29 07:57:53

标签: php

因此,我真的需要帮助,我购买了一些PHP文件管理器,但发现该功能缺失,因此无法使用。我非常了解HTML,但是PHP对我来说是新事物,因此任何帮助都将非常有用。我需要为每个下载用户添加每日限制。 我认为是文件下面的一些代码需要修改(但不确定):

<?php

if (!class_exists('Downloader', false)) {

    class Downloader
    {
        /**
        * Checks if file is under user folder
        *
        * @param string $checkPath path to check
        *
        * @return true/false
        */
        public function subDir($checkPath)
        {
            global $gateKeeper;

            if ($gateKeeper->getUserInfo('dir') == null) {
                return true;
            } else {
                $userdirs = json_decode($gateKeeper->getUserInfo('dir'), true);
                foreach ($userdirs as $value) {
                    $pos = strpos($checkPath, $value);
                    if ($pos !== false) {
                        return true;
                    }
                }
            }
            return false;
        }

        /**
        * The safe way
        *
        * @param string $checkfile file to check
        * @param string $path      relative path to call the functionf from /ajax/
        *
        * @return true/false
        */
        public function checkFile($checkfile, $path = '')
        {
            global $setUp;
            $fileclean = base64_decode($checkfile);
            $file = $path.'../'.urldecode($fileclean);

            $filepathinfo = Utils::mbPathinfo($fileclean);

            $filename = $filepathinfo['basename'];
            $safedir = $filepathinfo['dirname'];
            $safedir = str_replace(array('/', '.'), '', $safedir);
            $realfile = realpath($file);

            $realsetup = realpath($path.'.'.$setUp->getConfig('starting_dir'));

            $avoidDir = array('vfm-admin', 'etc');
            $avoidFile = array('index.php', 'vfm-thumb.php', '.htaccess', '.htpasswd');

            if (strpos($realfile, $realsetup) !== false
                && !in_array($safedir, $avoidDir) 
                && !in_array($filename, $avoidFile)
                && file_exists($file)
            ) {

                return true;
            }
            return false;
        }

        /**
        * Check download lifetime
        *
        * @param string $time time to check
        *
        * @return true/false
        */
        public function checkTime($time)
        {
            global $setUp;

            $lifedays = (int)$setUp->getConfig('lifetime');
            $lifetime = 86400 * $lifedays;
            if (time() <= $time + $lifetime) {
                return true;
            }
            return false;
        }

        /**
        * Get file info before processing download
        *
        * @param string $getfile file to download
        * @param string $playmp3 check audio
        *
        * @return $headers array
        */
        public function getHeaders($getfile, $playmp3 = false)
        {
            $headers = array();

            $audiofiles = array('mp3','wav');
            $trackfile = './'.urldecode(base64_decode($getfile));
            $file = '.'.$trackfile;

            $filepathinfo = Utils::mbPathinfo($file);
            $filename = $filepathinfo['basename'];
            $dirname = $filepathinfo['dirname'].'/';
            $ext = $filepathinfo['extension'];
            $file_size = Utils::getFileSize($file);
            $disposition = 'inline';

            if (strtolower($ext) == 'pdf') {
                $content_type = 'application/pdf';
            } elseif (strtolower($ext) == 'zip') {
                $content_type = 'application/zip';
                $disposition = 'attachment';
            } elseif (in_array(strtolower($ext), $audiofiles)
                && $playmp3 == 'play'
            ) {
                $content_type = 'audio/mp3';
            } else {
                $content_type = 'application/force-download';
            }
            $headers['file'] = $file;
            $headers['filename'] = $filename;
            $headers['file_size'] = $file_size;
            $headers['content_type'] = $content_type;
            $headers['disposition'] = $disposition;
            $headers['trackfile'] = $trackfile;
            $headers['dirname'] = $dirname;

            return $headers;
        }

        /**
        * Download files
        *
        * @param string $file         path to download
        * @param string $filename     file name
        * @param string $file_size    file size
        * @param string $content_type header content type
        * @param string $disposition  header disposition
        * @param bool   $android      android device
        *
        * @return file served
        */
        public function download(
            $file,
            $filename,
            $file_size,
            $content_type,
            $disposition = 'inline',
            $android = false
        ) {
            // Gzip enabled may set the wrong file size.
            if (function_exists('apache_setenv')) {
                @apache_setenv('no-gzip', 1);
            }
            if (ini_get('zlib.output_compression')) {
                @ini_set('zlib.output_compression', 'Off');
            }
            @set_time_limit(0);
            session_write_close();
            header("Content-Length: ".$file_size);

            if ($android) {
                header("Content-Type: application/octet-stream");
                header("Content-Disposition: attachment; filename=\"".$filename."\"");
            } else {
                header("Content-Type: $content_type");
                header("Content-Disposition: $disposition; filename=\"".$filename."\"");
                header("Content-Transfer-Encoding: binary");
                header("Expires: -1");
            }
            if (ob_get_level()) {
                ob_end_clean();
            }
            readfile($file);
            return true;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您需要在数据库中创建一个新表/列,您将在其中存储用户的下载量(用户已经下载了多少次)。您可以在const变量或DB中保留的下载限制数量也取决于您要如何管理。 然后,每次该用户要下载文件时,只需进行简单的检查-在if语句中已经执行downloadedTimes> = limitDownloadTimes。

在DB中有限制的好处是您可以在管理面板中创建函数以轻松更改其在DB中的值,而不必深入研究代码。

这里要编写的代码太多,因此我将其指出:  1.创建带有代表下载限制的数字的列(在新表格中-您可以将其与其他限制结合使用)  2.创建带有数字的列,该数字代表用户已经下载了多少次(用户下载时需要更新)。  3.进行UPDATE(当用户下载时)和SELECT(用于表示限制的数字)查询,还可以选择查询用于管理这些限制的查询(如果您希望在管理面板中拥有完全控制权,或者您拥有高级帐户等)。  4.每次用户下载文件时,请简单检查是否达到限制-如果没有达到限制,则放开它,如果是,则阻止下载选项。  5.使cron作业每24小时重置一次DB中的值(每个用户的下载量)