init(); $this->setSettings($settings); if (empty($this->path)) { if ($this->isPublicStore()) { $this->path = $this->app->path('extensions'); } else { $this->path = PATH_BASE . 'files' . DS . 'extensions' . DS; } } if (empty($this->url)) { $this->url = $this->app->url('extensions'); } if (empty($settings['attach'])) { $this->attach = new Attachment($this->path, $this->maxSize); $this->attach->setAllowedExtensions(( is_array($this->extensionsAllowed) ? $this->extensionsAllowed : explode(',', $this->extensionsAllowed) )); $this->attach->setFiledataAsString(false); $this->attach->setCheckFreeDiskSpace(false); $this->attach->setAssignErrors($this->assignErrors); } } /** * Загрузка файла стандартным методом * @param string $inputName имя file-поля * @return mixed */ public function uploadFILES(string $inputName) { $file = $this->attach->uploadFILES($inputName, 1); $this->saveData((!empty($file) ? [$file] : []), true); return $file; } /** * Загрузка файла при помощи QQ-загрузчика * @return mixed */ public function uploadQQ() { $file = $this->attach->uploadQQ(); $this->saveData((!empty($file) ? [$file] : []), true); return $file; } /** * Формирование ссылки на файл * @param array $fileData * @return string */ public function getURL(array $fileData): string { return $this->url . $fileData['filename']; } /** * Устанавливаем максимально допустимый размер вложения (в байтах) * @param int $maxSize 0 - без ограничения * @return void */ public function setMaxSize(int $maxSize = 0) { $this->attach->setMaxSize($maxSize); } /** * Получение максимально допустимого размера файла * @param bool $format применить форматирование * @param bool $formatExtTitle полное название объема данных (при форматировании) * @return int|string */ public function getMaxSize(bool $format = false, bool $formatExtTitle = false) { $maxSize = $this->attach->getMaxSize(); return ($format ? tpl::filesize($maxSize, $formatExtTitle) : $maxSize); } /** * Получение максимально доступного кол-ва загружаемых файлов * @return int */ public function getLimit(): int { return 1; } /** * Получаем способ хранения файлов * @return bool */ public function isPublicStore(): bool { return $this->publicStore; } /** * Сохранение данных о загруженных файлах * @param mixed $files данные * @param bool $deletePrev удалять предыдущие * @return void */ protected function saveData($files, bool $deletePrev = true) { if ($deletePrev) { $prev = $this->loadData(); if (!empty($prev)) { foreach ($prev as $v) { if (empty($v['filename'])) { continue; } $path = $this->path . $v['filename']; if (is_file($path)) { unlink($path); } } } } if (empty($files) || !is_array($files)) { $files = []; } config::save($this->configKey, $files, true); } /** * Удаление данных о загруженных файлах * @param array $fileNames * @return void */ public function deleteData(array $fileNames = []) { $this->saveData([], true); } /** * Получение данных о загруженных файлах * @return array */ public function loadData(): array { $data = config::get($this->configKey, [], TYPE_ARRAY); if (! empty($data)) { foreach ($data as $k => $v) { if (isset($v['filename'])) { $data[$k]['url'] = $this->getURL($v); } else { unset($data[$k]); } } } return $data; } }