Вход Регистрация
Файл: mc-2.6.3/modules/downloads/controllers/downloads.php
Строк: 576
<?php
/**
 * MobileCMS
 *
 * Open source content management system for mobile sites
 *
 * @author MobileCMS Team <support@mobilecms.ru>
 * @copyright Copyright (c) 2011, MobileCMS Team
 * @link http://mobilecms.ru Official site
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 */

// Папка с файлами загрузок
define('DOWNLOADS_DIRECTORY''files/downloads/');
// Максимальный размер файла для скачивания через force_download
define('FORCE_DOWNLOAD_MAX_FILESIZE'0);

/**
 * Контроллер пользовательской части загруз-центра
 */
class Downloads_Controller extends Controller {
    
/**
     * Construct
     */
    
public function __construct() {
        
parent::__construct();
        if (isset(
$_GET['preview'])) {
            if (
$_GET['preview'] == || $_GET['preview'] == 20 || $_GET['preview'] == 60 || $_GET['preview'] == 100)
                
$_SESSION['downloads_preview'] = $_GET['preview'];
        }
        if (isset(
$_GET['order_by'])) {
            if (
$_GET['order_by'] == 'name' || $_GET['order_by'] == 'time' || $_GET['order_by'] == 'downloads')
                
$_SESSION['order_by'] = $_GET['order_by'];
        }
        
# Хелпер загрузок
        
a_import('modules/downloads/helpers/downloads');
    }

    
/**
     * Метод по умолчанию
     */
    
public function action_index() {
        
$this->action_list_files();
    }

    
/**
     * Выбор превьюшек
     */
    
public function change_previews() {
        
$this->tpl->display('preview');
        exit;
    }

    
/**
     * Листинг файлов
     */
    
public function action_list_files() {
        if (!isset(
$_SESSION['downloads_preview'])) $_SESSION['downloads_preview'] = 60;

        if (empty(
$_GET['directory_id']) OR !is_numeric($_GET['directory_id'])) {
            
$directory_id 0;
        }
        else {
            
$directory_id intval($_GET['directory_id']);
            if (!
$directory $this->db->get_row("SELECT * FROM #__downloads_directories WHERE directory_id = '$directory_id'")) {
                
a_error('Папка не найдена!');
            }
        }

        switch (
$_GET['action']) {
            
# Поиск файлов
            
case 'search':
                
$action 'search';
                
$title 'Результаты поиска';
                
$sql "SELECT SQL_CALC_FOUND_ROWS
                        file_id,
                        name,
                        'file' AS type,
                        file_ext,
                        0 AS count_files,
                        0 AS new_day,
                        real_name,
                        filesize,
                        time,
                        path_to_file,
                        downloads,
                        screen1,
                        about,
                        previews,
                        (SELECT 0) AS position
                        FROM #__downloads_files
                        WHERE status = 'active' AND
                        name LIKE '%"
a_safe($_GET['search_word'])."%' ";

                if (
$directory_id != 0$sql .= " AND path_to_file LIKE '%/".$directory_id."/%' ";
                if (empty(
$_GET['search_word'])) $sql .= " AND 1 = 0 ";

                
$sql .= " LIMIT $this->start$this->per_page";
                break;
            
            
# Список новых файлов
            
case 'new_files':
                
$action 'new_files';
                
$title 'Новые файлы';
                
$sql "SELECT SQL_CALC_FOUND_ROWS
                        file_id,
                        name,
                        'file' AS type,
                        file_ext,
                        0 AS count_files,
                        0 AS new_day,
                        real_name,
                        filesize,
                        time,
                        path_to_file,
                        downloads,
                        screen1,
                        about,
                        previews,
                        (SELECT 0) AS position
                        FROM #__downloads_files
                        WHERE status = 'active' AND 1 = 1 "
;

                if (
$directory_id != 0$sql .= " AND path_to_file LIKE '%/".$directory_id."/%' ";

                
$sql .= " ORDER BY time DESC ";
                
$sql .= " LIMIT $this->start$this->per_page";
                break;

            
# Список папок и файлов
            
default:
                
$action 'list';
                
$title 'Загрузки'.(!empty($directory['name']) ? ' | '.$directory['name'] : '');
                
# Определяем папка с файлами или папками
                
if ($this->db->get_one("SELECT file_id FROM #__downloads_files WHERE directory_id = $directory_id AND real_name != ''")) {
                    
$is_files_directory true;
                    
$this->per_page $this->config['downloads']['files_per_page'];
                } else {
                    
$is_files_directory false;
                    
$this->per_page $this->config['downloads']['directories_per_page'];
                }

                
$this->tpl->assign('is_files_directory'$is_files_directory);

                if (
$directory['images'] == 'yes' && !isset($_GET['preview']) && !isset($_GET['start'])) {
                    
$this->change_previews();
                }

                
$directory_path downloads::get_path($directory_id$this->db);
                
$namepath downloads::get_namepath($directory_path' » ');


                
# Получаем список папок и файлов
                
$sql "SELECT SQL_CALC_FOUND_ROWS
                        dd.directory_id AS file_id,
                        dd.name,
                        'directory' AS type,
                        'directory' AS file_ext,
                        0 AS real_name,
                        0 AS filesize,
                        0 AS time,
                        0 AS path_to_file,
                        0 AS downloads,
                        0 AS screen1,
                        0 AS about,
                        0 AS previews,
                        dd.position
                        FROM #__downloads_directories AS dd
                        WHERE dd.parent_id = '
$directory_id'".PHP_EOL;
                
$sql .= "UNION ALL".PHP_EOL;
                
$sql .= "SELECT
                        file_id,
                        name,
                        'file' AS type,
                        file_ext,
                        real_name,
                        filesize,
                        time,
                        path_to_file,
                        downloads,
                        screen1,
                        about,
                        previews,
                        (SELECT 0) AS position
                        FROM #__downloads_files
                        WHERE
                        directory_id = '
$directory_id' AND
                        status = 'active' AND
                        real_name != ''"
.PHP_EOL;

                
$sql .= "ORDER BY type ASC, ";

                
# Сортировка
                
if ($is_files_directory) {
                    switch (
$_SESSION['order_by']) {
                        case 
'name':
                            
$sql .= "name ASC ";
                            break;
                        case 
'downloads':
                            
$sql .= "downloads DESC ";
                            break;
                        default:
                            
$sql .= "time DESC ";
                            break;
                    }
                } else {
                    
$sql .= "position ASC ";
                }

                
$sql .= " LIMIT $this->start$this->per_page";
                break;
        }
        
        
# Работаем с кешем
        
if ($action == 'list' && !$is_files_directory && $this->config['downloads']['cache_time'] > 0) {
            
$using_cache true;
            
            
$cache_key 'downloads_'.$directory_id.'_'.$this->start;
            
$files $this->cache->get($cache_key$this->config['downloads']['cache_time'] * 60);
        }
        
        if (empty(
$files)) {
            
$result $this->db->query($sql);
            
$total $this->db->get_one("SELECT FOUND_ROWS()");
    
            
$files = array();
            while (
$file $this->db->fetch_array($result)) {
                
# Получаем счетчики файлов в папках
                
if ($file['type'] == 'directory') {
                    
$counts $this->db->get_row("SELECT
                        COUNT(CASE WHEN status = 'active' THEN 1 END) AS count_files,
                        COUNT(CASE WHEN time > UNIX_TIMESTAMP( ) - 86400 THEN 1 END) AS new_day
                        FROM #__downloads_files
                        WHERE path_to_file LIKE '%/"
$file['file_id']."/%'
                    "
);
                    
                    
$file['count_files'] = $counts['count_files'];
                    
$file['new_day'] = $counts['new_day'];
                }
                
                
$files[] = $file;
            }
            
            
$files['total'] = $total;
            
            if (
$using_cache$this->cache->set($cache_key$files);
        }

        
# Пагинация
        
$http_query http_build_query(array(
            
'directory_id' => $_GET['directory_id'],
            
'action' => $_GET['action'],
            
'search_word' => $_GET['search_word']
        ), 
'''&amp;');

        
$pg_conf['base_url'] = $_GET['directory_id'] == a_url('downloads/list_files'$http_query.'&amp;start='true) : a_url('downloads/list_files'$http_query.'&amp;start=');
        
$pg_conf['total_rows'] = $files['total'];
        
$pg_conf['per_page'] = $this->per_page;

        
a_import('libraries/pagination');
        
$pg = new CI_Pagination($pg_conf);
        
        
# Удаляем лишние данные
        
unset($files['total']);

        
$this->tpl->assign(array(
            
'files' => $files,
            
'total' => $total,
            
'action' => $action,
            
'title' => $title,
            
'navigation' => $namepath,
            
'pagination' => $pg->create_links(),
            
'directory' => $directory,
            
'_config' => $this->config['downloads'],
        ));

        
$this->tpl->display('list_files');
    }

    
/**
     * Форма поиска
     */
    
public function action_search_form() {
        if (empty(
$_GET['directory_id']) || !is_numeric($_GET['directory_id'])) {
            
$directory_id 0;
        } else {
            
$directory_id intval($_GET['directory_id']);

            if (!
$directory $this->db->get_row("SELECT * FROM #__downloads_directories WHERE directory_id = '$directory_id'")) a_error('Папка не найдена');
        }
        
        
$directory_path downloads::get_path($directory['directory_id'], $this->db);
        
$navigation downloads::get_namepath($directory_path' &raquo; ');

        if (
$directory['directory_id'] > 0$navigation .= (!empty($navigation) ? ' &raquo; ' '').'<a href="'.URL.'downloads/'.$directory['directory_id'].'">'.$directory['name'].'</a>';

        if (
$_GET['send']) {
            if (empty(
$_GET['search_word'])) $this->error .= 'Укажите запрос<br />';

            if (!
$this->error) {
                
header('Location: '.a_url('downloads/list_files''action=search&directory_id='.($directory_id $directory_id '').'&search_word='.urlencode($_GET['search_word'])));
                exit;
            }
        }

        
$this->tpl->assign(array(
            
'error' => $this->error,
            
'directory' => $directory,
            
'directory_id' => $directory_id,
            
'navigation' => $navigation,
        ));

        
$this->tpl->display('search_form');
    }

    
/**
     * Скачивание файла
     */
    
public function action_download_file() {
        
$file_id intval($_GET['file_id']);

        if (!
$file $this->db->get_row("SELECT * FROM #__downloads_files WHERE file_id = '$file_id'"))
            
a_error('Файл не найден!');

        
# Обновляем количество закачек файла
        
$this->db->query("UPDATE #__downloads_files SET downloads = downloads + 1 WHERE file_id = '$file_id'");

        if (!
file_exists(ROOT.$file['path_to_file'].'/'.$file['real_name']))
            
a_error('Файл отсутствует!');

        if (
$file['filesize'] > FORCE_DOWNLOAD_MAX_FILESIZE) {
            
header('location: '.URL.$file['path_to_file'].'/'.$file['real_name']);
            exit;
        }
        else {
            
$file_content file_get_contents(ROOT.$file['path_to_file'].'/'.$file['real_name']);
            
downloads::force_download($file['real_name'], $file_content$file_id.'_'.$CONFIG['downloads_prefix'].'_'FALSE);
        }
    }

    
/**
     * Получение jad из jar
     */
    
public function action_get_jad() {
        if(!
$file $this->db->get_row("SELECT * FROM #__downloads_files WHERE file_id = '"intval($_GET['file_id']) ."'"))
            
a_error("Файл не найден!");

        if(
is_numeric($_GET['add_file'])) {
            if(!empty(
$file['add_file_real_name_'$_GET['add_file']])) {
                
$jar_name $file['add_file_real_name_'$_GET['add_file']];
                
$file_ext array_pop(explode('.'$jar_name));
            }
            else 
a_error("Дополнительный файл не найтен!");
        }
        else {
            
$jar_name $file['real_name'];
            
$file_ext $file['file_ext'];
        }
    
        if (
$file_ext != 'jar'a_error("Это не JAR файл!");

        
# Увеличиваем количество скачиваний файла
        
$this->db->query("UPDATE a_downloads_files SET downloads = downloads + 1 WHERE file_id = '".$file['file_id']."'");
    
        if (!
class_exists('PclZip')) a_import('libraries/pclzip.lib');
        
a_import('libraries/j2me_tools');
    
        
$jar_path ROOT.$file['path_to_file'].'/'.$jar_name;
        
$jar_url URL.$file['path_to_file'].'/'.$jar_name;
        
$jad_contents j2me_tools::get_jad($jar_path$jar_url);
    
        
header('Content-type: text/vnd.sun.j2me.app-descriptor;charset=UTF-8');
        echo 
$jad_contents;
    }

    
/**
     * Просмотр деталей файла
     */
    
public function action_view_file() {
        
# Инфо о файле
        
if (!$file $this->db->get_row("SELECT *,
             (SELECT username FROM #__users AS u WHERE u.user_id = df.user_id) AS username,
             (SELECT COUNT(*) FROM #__comments_posts WHERE module = 'downloads' AND item_id = df.file_id) comments
             FROM #__downloads_files AS df WHERE df.file_id = '"
intval($_GET['file_id'])."'"))
            
a_error('Файл не найден!');

        
$directory $this->db->get_row("SELECT * FROM #__downloads_directories WHERE directory_id = '".$file['directory_id']."'");
        if (
$this->db->get_one("SELECT id FROM a_rating_logs WHERE ip = '".a_safe($_SERVER['REMOTE_ADDR'])."' AND module = 'downloads' AND item_id = '".$file['file_id']."'"))
            
$file['rated'] = true;
        else 
$file['rated'] = false;

        
# Получаем скриншоты файла
        
$file['screens'] = '';
        if (!empty(
$file['screen1']) && empty($_GET['s']))
            
$file['screens'] .= '<img src="'.URL.$file['path_to_file'].'/'.$file['screen1'].'" alt="" /><br />';
        elseif (!empty(
$file['screen2']) && $_GET['s'] == 2)
            
$file['screens'] .= '<img src="'.URL.$file['path_to_file'].'/'.$file['screen2'].'" alt="" /><br />';
        elseif (!empty(
$file['screen3']) && $_GET['s'] == 3)
            
$file['screens'] .= '<img src="'.URL.$file['path_to_file'].'/'.$file['screen3'].'" alt="" /><br />';

        if (!empty(
$file['screen2'])) {
            
$file['screens'] .= empty($_GET['s']) ? '<b>1</b>' '<a href="'.a_url('downloads/view_file''file_id='.$file['file_id']).'">1</a>';
            
$file['screens'] .= ', '.(($_GET['s'] == 2) ? '<b>2</b>' '<a href="'.a_url('downloads/view_file''file_id='.$file['file_id'].'&amp;s=2').'">2</a>');
            if (!empty(
$file['screen3']))
                
$file['screens'] .= ', '.(($_GET['s'] == 3) ? '<b>3</b>' '<a href="'.a_url('downloads/view_file''file_id='.$file['file_id'].'&amp;s=3').'">3</a>');
        }

        if (!empty(
$file['screens'])) $file['screens'] .= '<br /><br />';

        
$file['about'] = nl2br(main::bbcode($file['about']));
        
$file['rating_stars'] = file_get_contents(URL.'main/rating?rate='.$file['rating']);

        
$directory_path downloads::get_path($file['directory_id'], $this->db);
        
$navigation downloads::get_namepath($directory_path' » ');

        if (
$directory['directory_id'] > 0)
            
$navigation .= (!empty($navigation) ? ' » ' '').'<a href="'.a_url('downloads''directory_id='.$directory['directory_id']).'">'.$directory['name'].'</a>';

        
$this->tpl->assign(array(
            
'file' => $file,
            
'directory' => $directory,
            
'navigation' => $navigation
        
));
    
        
$this->tpl->display('view_file');
    }

    
/**
     * Изменение рейтинга файла
     */
    
public function action_rating_change() {
        if (!
$file $this->db->get_row("SELECT file_id, user_id FROM a_downloads_files WHERE file_id = '".intval($_GET['file_id'])."'"))
            
a_error("Файл не найден!");

        if (
$this->db->get_one("SELECT id FROM a_rating_logs WHERE module = 'downloads' AND ip = '".a_safe($_SERVER['REMOTE_ADDR'])."' AND item_id = '".$file['file_id']."'"))
            
a_error("Вы голосовали за данный файл ранее!");

        if (
$file['user_id'] == USER_ID)
            
a_error("Голосовать за свой файл нельзя!");

        
$est intval($_GET['est']);
        if (
$est != && $est != && $est != && $est != && $est != 5)
            
a_error("Оценка не определена!");

        
# Увеличиваем количество голосов
        
$this->db->query("UPDATE a_downloads_files SET
            rating = (rating * rating_voices + 
$est) / (rating_voices + 1),
            rating_voices = rating_voices + 1
            WHERE file_id = '"
.$file['file_id']."'
        "
);

        
# Добавляем голос в логи
        
$this->db->query("INSERT INTO a_rating_logs SET
            module = 'downloads',
            ip = '"
a_safe($_SERVER['REMOTE_ADDR'])."',
            item_id = '"
$file['file_id']."',
            time = UNIX_TIMESTAMP()
        "
);

        
a_notice("Оценка принята!"URL.'downloads/view/'.$file['file_id']);
    }

    
/**
     * Управление файлами пользователей
     */
    
public function action_user_files() {
        
// Запрет выгрузки гостям
        
if (USER_ID == -1a_error('Для выгрузки файлов на сайт необходимо <a href="'.a_url('user/login').'">войти</a> или <a href="'.a_url('user/registration').'">зарегистрироваться</a>');
        
        
// Запрет выгрузки файлов пользователями
        
if ($this->config['downloads']['user_upload'] == 0a_error('Выгрузка файлов на сайт пользователями запрещена');
        
        
// Проверка действия
        
if ($_GET['action'] != 'add' && $_GET['action'] != 'edit' && $_GET['action'] != 'delete'a_error('Не выбрано действие');
        
        
// Проверка директории
        
if ($_GET['action'] == 'add' && !$directory $this->db->get_row("SELECT * FROM #__downloads_directories WHERE directory_id = '".intval($_GET['directory_id'])."' AND user_files = 'yes'")) a_error('Папка не найдена, либо не предназначена для выгрузки файлов пользователями в нее');
        
        switch (
$_GET['action']) {
            case 
'add':
                
$action 'add';
                
$title 'Добавление файла';
                
                
$directory_path downloads::get_path($directory['directory_id'], $this->db);
                
$navigation downloads::get_namepath($directory_path' &raquo; ');

                if (
$directory['directory_id'] > 0$navigation .= (!empty($navigation) ? ' &raquo; ' '').'<a href="'.URL.'downloads/'.$directory['directory_id'].'">'.$directory['name'].'</a>';
            
                
// Обработка формы выгрузки файла
                
if ($_POST['submit']) {
                    
// Фильтрация данных
                    
$name htmlspecialchars(trim($_POST['name']));
                    
$about htmlspecialchars(trim($_POST['about']));
                
                    
// Массивс информацией о файле
                    
$file = array();
                    
                    
// Проверка корректности данных
                    
if (!empty($name) && main::strlen($name) > 32$this->error .= 'Имя файла не должно быть длинее 32 символов<br />';
                    
                    if (!empty(
$about) && main::strlen($about) > 5000$this->error .= 'Описание не должно быть длинее 5000 символов<br />';
                    
                    
// Получение информации о файле
                    
if (!empty($_FILES['file_upload']['tmp_name'])) {
                        
$type 'upload';
                        
$file['real_name'] = $_FILES['file_upload']['name'];
                        
$file['file_ext'] = array_pop(explode('.'$file['real_name']));
                        
$file['filesize'] = filesize($_FILES['file_upload']['tmp_name']);
                    } else if (!empty(
$_POST['file_import']) && $_POST['file_import'] != 'http://') {
                        
$type 'import';
                        
$file['real_name'] = basename($_POST['file_import']);
                        
$file['file_ext'] = array_pop(explode('.'$file['real_name']));
                        
$file['filesize'] = downloads::get_filesize($_POST['file_import']);
                    } else {
                        
$this->error 'Укажите загружаемый файл<br />';
                    }
                    
                    
// Проверка типа файла
                    
if ( ! strstr(';'$this->config['downloads']['allowed_filetypes'] .';'';'$file['file_ext'] .';') && $type) {
                        
$this->error .= 'Вы пытаетесь загрузить запрещенный тип файла<br />';
                    }

                    
// Проверка размера файла
                    
if (($file['filesize'] > $this->config['downloads']['max_filesize'] * 1048576) || $file['filesize'] === FALSE) {
                        
$this->error .= 'Размер загружаемого файла превышает допустимый размер ('$this->config['downloads']['max_filesize'] .' Mb)<br />';
                    }
                    
                    
// Сохранение файла
                    
if ( ! $this->error) {
                        
// Получение ID файла
                        
$this->db->query("INSERT INTO #__downloads_files SET file_id = 'NULL'");
                        
$file_id $this->db->insert_id();

                        
$directory_path downloads::get_path($directory['directory_id'], $this->db);
                           
$realpath downloads::get_realpath($directory_path);
                        
$realpath = ($realpath != '' $realpath '/' :  '') . ($directory['directory_id'] == '' $directory['directory_id'] . '/');

                        
// Создание папки для файла
                        
mkdir(ROOT DOWNLOADS_DIRECTORY $realpath $file_id);
                           
chmod(ROOT DOWNLOADS_DIRECTORY $realpath $file_id0777);

                           
$path_to_file DOWNLOADS_DIRECTORY . ($realpath != '' $realpath '') . $file_id;

                           if (
$type == 'upload') {
                               
$file_path ROOT $path_to_file .'/'$_FILES['file_upload']['name'];
                            
copy($_FILES['file_upload']['tmp_name'], $file_path);
                        } else {
                            
$file_path ROOT $path_to_file .'/'basename($_POST['file_import']);
                            
copy($_POST['file_import'], $file_path);
                        }
                        
                        
// Работа со скриншотом к основному файлу
                        
if ( ! empty($_FILES['screen1']['tmp_name'])) {
                            
$screen_path ROOT $path_to_file .'/'$_FILES['screen1']['name'];

                            if (
copy($_FILES['screen1']['tmp_name'], $screen_path)) {
                                if (
$this->config['downloads']['screens_width'] > 0) {
                                    
main::image_resize($screen_path$screen_pathintval($this->config['downloads']['screens_width']));
                                }

                                
$file['screen1'] = $_FILES['screen1']['name'];
                            }
                        } else if (!empty(
$_POST['screen1']) && $_POST['screen1'] != 'http://') {
                            
$import_file_path fm::get_real_file_path($_POST['screen_1']);
                            
$import_file_name basename($import_file_path);
                            
$screen_path ROOT.$path_to_file.'/'.$import_file_name;

                            if (
copy($import_file_path$screen_path)) {
                                if (
$this->config['downloads']['screens_width'] > 0) {
                                    
main::image_resize($screen_path$screen_pathintval($this->config['downloads']['screens_width']));
                                }

                                
$file['screen1'] = $import_file_name;
                            }
                        }
                        
                        
$file['name'] = $_POST['name'];
                        
$file['about'] = $_POST['about'];
                        if (
$this->config['downloads']['moderation'] == 1) {
                            
$file['status'] = 'moderate';
                        } else {
                            
$file['status'] = 'active';
                        }
                        
$file['user_id'] = USER_ID;
                        
$file['path_to_file'] = $path_to_file;
                        
$file['directory_id'] = $directory['directory_id'];

                        
// Выполнение действий над определенными типами файлов
                        
$file downloads::filetype_actions($file);

                        
// Изменение файла в базе
                        
downloads::update_file($this->db$file_id$file);

                        
a_notice($this->config['downloads']['moderation'] == 'Файл успешно загружен. Он будет доступен для скачиваниями другими пользователями после прохождения модерации' 'Файл успешно загружен'URL.'downloads/view/'.$file_id);
                    }
                }
            break;
            
            case 
'edit':
                
$action 'edit';
                
$title 'Изменение файла';
            
                
// Проверка файла
                
if ( ! $file $this->db->get_row("SELECT * FROM #__downloads_files WHERE file_id = '"intval($_GET['file_id']) ."' AND user_id = '"USER_ID ."' AND path_to_file != ''")) a_error('Файл не найден');
                
                
$directory $this->db->get_row("SELECT * FROM #__downloads_directories WHERE directory_id = '$file[directory_id]'");
                
                
$directory_path downloads::get_path($directory['directory_id'], $this->db);
                
$navigation downloads::get_namepath($directory_path' &raquo; ');

                if (
$directory['directory_id'] > 0$navigation .= ( ! empty($navigation) ? ' &raquo; ' '') .'<a href="'URL .'downloads/'$directory['directory_id'] .'">'$directory['name'] .'</a>';
                
                
// Обработка формы выгрузки файла
                
if ($_POST['submit']) {
                    
// Фильтрация данных
                    
$name htmlspecialchars(trim($_POST['name']));
                    
$about htmlspecialchars(trim($_POST['about']));

                    
// Проверка корректности данных
                    
if ( ! empty($name) && main::strlen($name) > 32) {
                        
$this->error .= 'Имя файла не должно быть длинее 32 символов<br />';
                    }

                    if ( ! empty(
$about) && main::strlen($about) > 5000) {
                        
$this->error .= 'Описание не должно быть длинее 5000 символов<br />';
                    }

                    
// Получение информации о файле
                    
if ( ! empty($_FILES['file_upload']['tmp_name'])) {
                        @
unlink(ROOT $file['path_to_file'] .'/'$file['real_name']);
                        
$type 'upload';
                        
$file['real_name'] = $_FILES['file_upload']['name'];
                        
$file['file_ext'] = array_pop(explode('.'$file['real_name']));
                        
$file['filesize'] = filesize($_FILES['file_upload']['tmp_name']);
                    } else if ( ! empty(
$_POST['file_import']) && $_POST['file_import'] != 'http://') {
                        @
unlink(ROOT $file['path_to_file'] .'/'$file['real_name']);
                        
$type 'import';
                        
$file['real_name'] = basename($_POST['file_import']);
                        
$file['file_ext'] = array_pop(explode('.'$file['real_name']));
                        
$file['filesize'] = downloads::get_filesize($_POST['file_import']);
                    }

                    
// Проверка типа файла
                    
if ( ! strstr(';'$this->config['downloads']['allowed_filetypes'] .';'';'$file['file_ext'] .';') && $type) {
                        
$this->error .= 'Вы пытаетесь загрузить запрещенный тип файла<br />';
                    }

                    
// Проверка размера файла
                    
if (($file['filesize'] > $this->config['downloads']['max_filesize'] * 1048576) || $file['filesize'] === FALSE) {
                        
$this->error .= 'Размер загружаемого файла превышает допустимый размер ('$this->config['downloads']['max_filesize'] .' Mb)<br />';
                    }

                    
// Сохранение файла
                    
if ( ! $this->error) {
                        
// Получение ID файла
                        
$file_id $file['file_id'];

                           
$path_to_file $file['path_to_file'];

                           if (
$type && $type == 'upload') {
                             
$file_path ROOT $path_to_file .'/'$_FILES['file_upload']['name'];
                            
copy($_FILES['file_upload']['tmp_name'], $file_path);
                        } elseif (
$type && $type == 'import') {
                            
$file_path ROOT $path_to_file .'/'basename($_POST['file_import']);
                            
copy($_POST['file_import'], $file_path);
                        }

                        
// Работа со скриншотом к основному файлу
                        
if ( ! empty($_FILES['screen1']['tmp_name'])) {
                            @
unlink(ROOT $path_to_file .'/'$file['screen1']);
                        
                            
$screen_path ROOT $path_to_file .'/'$_FILES['screen1']['name'];

                            if (
copy($_FILES['screen1']['tmp_name'], $screen_path)) {
                                if (
$this->config['downloads']['screens_width'] > 0) {
                                    
main::image_resize($screen_path$screen_pathintval($this->config['downloads']['screens_width']));
                                }

                                
$file['screen1'] = $_FILES['screen1']['name'];
                            }
                        } else if ( ! empty(
$_POST['screen1']) && $_POST['screen1'] != 'http://') {
                            @
unlink(ROOT $path_to_file .'/'$file['screen1']);
                        
                            
$import_file_path fm::get_real_file_path($_POST['screen_1']);
                            
$import_file_name basename($import_file_path);
                            
$screen_path ROOT $path_to_file .'/'$import_file_name;

                            if (
copy($import_file_path$screen_path)) {
                                if (
$this->config['downloads']['screens_width'] > 0) {
                                    
main::image_resize($screen_path$screen_pathintval($this->config['downloads']['screens_width']));
                                }

                                
$file['screen1'] = $import_file_name;
                            }
                        }

                        
$file['name'] = $_POST['name'];
                        
$file['about'] = $_POST['about'];
                        if (
$this->config['downloads']['moderation'] == 1) {
                            
$file['status'] = 'moderate';
                        } else {
                            
$file['status'] = 'active';
                        }
                        
$file['user_id'] = USER_ID;
                        
$file['path_to_file'] = $path_to_file;
                        
$file['directory_id'] = $directory['directory_id'];

                        
// Выполнение действий над определенными типами файлов
                        
$file downloads::filetype_actions($file);

                        
// Изменение файла в базе
                        
downloads::update_file($this->db$file_id$file);

                        
a_notice($this->config['downloads']['moderation'] == 'Файл успешно изменен. Он будет доступен для скачиваниями другими пользователями после прохождения модерации' 'Файл успешно загружен'URL.'downloads/view/'.$file_id);
                    }
                }
            break;
            
            case 
'delete':
                
$action 'delete';
                
$title 'Удаление файла';
            
                
// Проверка файла
                
if ( ! $file $this->db->get_row("SELECT * FROM #__downloads_files WHERE file_id = '"intval($_GET['file_id']) ."' AND user_id = '"USER_ID ."' AND path_to_file != ''")) a_error('Файл не найден');
                
                if ( ! empty(
$_GET['confirm'])) {
                    
// Удаление папки из ФС
                    
main::delete_dir(ROOT $file['path_to_file']);

                    
// Удаление файла из БД
                    
$this->db->query("DELETE FROM #__downloads_files WHERE file_id = '"$file['file_id'] ."'");

                    
a_notice('Файл успешно удален'URL .'downloads/'$file['directory_id']);
                } else {
                    
a_confirm('Вы подтверждаете удаление данного файла?'a_url('downloads/user_files''action=delete&amp;file_id='$file['file_id'] .'&amp;confirm=ok'), URL .'downloads/view/'$file['file_id']);
                }
            break;
        }
        
        
$this->tpl->assign(array(
            
'error' => $this->error,
            
'directory' => $directory,
            
'action' => $action,
            
'title' => $title,
            
'file' => $file,
            
'navigation' => $navigation,
        ));

        
$this->tpl->display('user_files');
    }
    
    
/**
     * Файлы и комментарии пользователя
     */
    
public function action_my() {
        
// Запрет доступа гостям
        
if (USER_ID == -1a_error('Для доступа к странице необходимо <a href="'a_url('user/login') .'">войти</a> или <a href="'a_url('user/registration') .'">зарегистрироваться</a>');

        
// Проверка действия
        
if ($_GET['action'] != 'files' && $_GET['action'] != 'comments'a_error('Не выбрано действие');
        
        switch(
$_GET['action']) {
            case 
'files':
                
$action 'files';
                
$title 'Мои файлы';

                
$result $this->db->query("SELECT * FROM #__downloads_files WHERE user_id = '"USER_ID ."' ORDER BY time DESC LIMIT $this->start$this->per_page");
                
$total $this->db->get_one("SELECT COUNT(*) FROM #__downloads_files WHERE user_id = '"USER_ID ."'");

                
$files = array();
                while (
$file $this->db->fetch_array($result)) {
                    
$files[] = $file;
                }

                
$files['total'] = $total;

                
$pg_conf['base_url'] = a_url('downloads/my''action=files&amp;start=');
                
$pg_conf['total_rows'] = $files['total'];
                
$pg_conf['per_page'] = $this->per_page;

                
a_import('libraries/pagination');
                
$pg = new CI_Pagination($pg_conf);

                
// Удаляем лишние данные
                
unset($files['total']);

                
$this->tpl->assign(array(
                    
'title' => $title,
                    
'action' => $action,
                    
'pagination' => $pg->create_links(),
                    
'total' => $total,
                    
'files' => $files,
                    
'start' => $this->start,
                    
'_config' => $this->config['downloads'],
                ));

                
$this->tpl->display('my_files');
            break;
            
            case 
'comments':
            break;
        }
    }
}
?>
Онлайн: 0
Реклама