Система управления «Сайт PRO»
Версия 20240107

Класс Upload

Объект $Field: Cms\Root\Form\Field\Upload наследует Cms\Root\Form\Field\Base

Объект «Поле: загрузка файла»

Исходный код
class Upload extends Base { … }

Свойства

$extensions

$Upload->extensions = '~\\.(\\w+)\\$~i';
Исходный код
    var $extensions = '~\\.(\\w+)\\$~i';

$upload_error

$Upload->upload_error
Исходный код
    var $upload_error;

Методы

request()

$Upload->request();

Получение значения поля

Исходный код
    function request() {
        $root = $this->root();
        $Main = $this->Main();
        $name = $this->name;
        if (!strlen($name)) return;
        if ($Page = $this->Page()) $this->value = $Page->get($name);
        if ($_POST || $_FILES) {
            if ($_FILE = $_FILES[$this->name]) {
                if ($_FILE['error'] == 0) {
                    if (!preg_match($this->extensions, $_FILE['name'], $m) || strpos($_FILE['name'], '.php') !== false) {
                        $this->upload_error = 'Недопустимый тип файла';
                    } else {
                        $folder = '/upload';
                        if (!is_dir("$root$folder")) {
                            @mkdir("$root$folder");
                            @chmod("$root$folder", 0777);
                        }
                        $tmp = $folder . '/' . sha1(uniqid(microtime()));
                        if (@move_uploaded_file($_FILE['tmp_name'], $root . $tmp)) {
                            @chmod("$root$tmp", 0666);
                            if ($a = @getimagesize($root . $tmp)) {
                                switch ($a[2]) {
                                    case IMAGETYPE_JPEG: $m[1] = 'jpg'; break;
                                    case IMAGETYPE_GIF: $m[1] = 'gif'; break;
                                    case IMAGETYPE_PNG: $m[1] = 'png'; break;
                                }
                            }
                            $value = $folder . '/' . sha1_file($root . $tmp) . '.' . $m[1];
                            if (!file_exists($root . $value)) {
                                if (@rename($root . $tmp, $root . $value)) {
                                    $this->value = $value;
                                } else {
                                    @unlink($root . $tmp);
                                    $this->upload_error = 'Ошибка загрузки файла';
                                }
                            } else {
                                @touch($root . $value);
                                $this->value = $value;
                            }
                        } else {
                            $this->upload_error = 'Ошибка загрузки файла';
                        }
                    }
                } elseif ($_FILE['error'] !== 4) {
                    $this->upload_error = 'Размер файла превышает допустимое значение';
                }
            }
        } elseif (!isset($this->value) && isset($this->default)) {
            $this->value = $this->default;
        }
    }

cleanup()

$Upload->cleanup();
Исходный код
    function cleanup() {
        $root = $this->root();
        if (strlen($this->value) && strpos('/' . $this->value . '/', '/../') === false && strpos($this->value, '.php') === false) {
            if (substr($this->value, 0, 8) === '/upload/') @unlink("$root{$this->value}");
            else @unlink($root . '/upload' . $this->value);
        }
    }

check()

$Upload->check();

Проверка правильности ввода

Возвращает: string|null null – успешная проверка; string – ошибка

Исходный код
    function check() {
        if ($this->upload_error) return $this->error = $this->upload_error;
        if (!empty($e = parent::check())) return $e;
    }

text()

$Upload->text();
Исходный код
    function text() {
        if ($value = $this->value) {
            $this->value = $this->Main()->Request()->absoluteUrl($value);
            $r = parent::text();
            $this->value = $value;
        } else {
            $r = parent::text();
        }
        return $r;
    }

html()

$Upload->html();
Исходный код
    function html() {
        if ($value = $this->value) {
            $this->value = $this->Main()->Request()->absoluteUrl($value);
            $r = parent::html();
            $this->value = $value;
        } else {
            $r = parent::html();
        }
        return $r;
    }