base_folder = $params->folder; $this->addValidTypes(array_keys($params->types)); $this->addFolders($params->types); } public function addFolders(array $folders): FileHandler { foreach ($folders as $type => $folder) { $this->addFolder($type, $folder); } return $this; } public function addFolder(string $type, string $folder): FileHandler { $this->folders[$type] = $folder; return $this; } public function addValidTypes(array $valid_types): FileHandler { foreach ($valid_types as $type) { $this->addValidType($type); } return $this; } public function addValidType(string $type): FileHandler { $this->valid_types []= $type; return $this; } public function getType(string $folder): string { return array_search($folder, $this->folders); } public function uploadFile(UploadedFileInterface $file, string $new_name = null): bool { if ($file->getError() !== UPLOAD_ERR_OK) { return false; } if (!in_array($file->getClientMediaType(), array_keys($this->valid_types))) { return false; } if ($new_name === null) { $new_name = $file->getClientFilename(); } $filenfo = new \SplFileInfo($file->getClientFilename()); if (!str_contains($new_name, $filenfo->getExtension())) { $new_name .= '.' . $filenfo->getExtension(); } $to = implode(DIRECTORY_SEPARATOR, [$this->base_folder, $this->folders[$file->getClientMediaType()], $new_name]); $file->moveTo($to); return file_exists($to); } public function listFiles(): array { $output = []; foreach ($this->folders as $f) { $folder = implode(DIRECTORY_SEPARATOR, [$this->base_folder, $f]); if (!file_exists($folder)) { continue; } $files = new \DirectoryIterator($folder); foreach ($files as $file) { if ($file->isDir()) { continue; } $output []= (object) ['folder' => $f, 'filename' => $file->getBasename()]; } } return $output; } protected function validateFilename(string $folder, string $filename): bool|string { if (!in_array($folder, $this->folders)) { return false; } $f = implode(DIRECTORY_SEPARATOR, [$this->base_folder, $folder, $filename]); if (!file_exists($f)) { return false; } return $f; } public function getInfo(string $folder, string $filename): \SplFileInfo|bool { if (!$f = $this->validateFilename($folder, $filename)) { return false; } return new \SplFileInfo($f); } public function getFile(string $folder, string $filename): StreamInterface|bool { if (!$f = $this->validateFilename($folder, $filename)) { return false; } return Stream::create(file_get_contents($f)); } public function editFilename(string $folder, string $filename, string $new_name): bool { if (!$f = $this->validateFilename($folder, $filename)) { return false; } $info = new \SplFileInfo($f); $new = implode(DIRECTORY_SEPARATOR, [$this->base_folder, $folder, $new_name . '.' . $info->getExtension()]); return rename($f, $new); } public function deleteFile(string $folder, string $filename): bool { if (!$f = $this->validateFilename($folder, $filename)) { return false; } return unlink($f); } }