projectDir = $projectDir; $this->internalDirectory = $internalDirectory; $this->publicDirectory = $publicDirectory; $this->slugger = $slugger; $this->urlGenerator = $urlGenerator; $this->registerFileTypes(); } private function registerFileTypes() { $this->fileTypes = []; //user related $classType = 'App\Entity\User'; $this->fileTypes['avatar'] = new FileType('avatar', $classType, true, false); $this->fileTypes['email_avatar'] = new FileType('email_avatar', $classType, false, false); $this->fileTypes['contract_employment'] = new FileType('contract_employment', $classType, true, true); //document related $classType = 'App\Entity\Document'; $this->fileTypes['documentInternal'] = new FileType('documentInternal', $classType, true, false); } public function delete(string $fileTypeName, string $fileName): bool { $fileType = null; if (isset($this->fileTypes[$fileTypeName])) { $fileType = $this->fileTypes[$fileTypeName]; } else { throw new \Exception("Unknown File Type"); } $path = $this->getPublicDirectoryPath(); if ($fileType->isInternal) { $path = $this->getInternalDirectoryPath(); } if ( file_exists($path . $fileName) && !is_dir($path . $fileName) ) { if (unlink($path . $fileName)) { return true; } } return false; } public function upload(string $fileTypeName, UploadedFile $file): ?string { $fileType = null; if (isset($this->fileTypes[$fileTypeName])) { $fileType = $this->fileTypes[$fileTypeName]; } else { throw new \Exception("Unknown File Type"); } $originalFilename = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME); $safeFilename = $this->slugger->slug($originalFilename); $fileName = $safeFilename . '-' . uniqid() . '.' . $file->guessExtension(); $path = $this->getPublicDirectoryPath(); if ($fileType->isInternal) { $path = $this->getInternalDirectoryPath(); } try { $file->move($path, $fileName); } catch (FileException $e) { return null; } return $fileName; } public function getInternalDirectory(): string { return $this->internalDirectory; } public function getInternalDirectoryPath(): string { return $this->projectDir . DIRECTORY_SEPARATOR . $this->internalDirectory; } public function getInternalDirectoryUrl(string $filename = ''): string { return $this->urlGenerator->generate('file-internal', [$filename], UrlGeneratorInterface::ABSOLUTE_URL) . $this->internalDirectory; } public function getPublicDirectory(): string { return $this->publicDirectory; } public function getPublicDirectoryPath(): string { return $this->projectDir . DIRECTORY_SEPARATOR . $this->publicDirectory; } public function getPublicDirectoryUrl(string $filename = ''): string { return $this->urlGenerator->generate('file-public', [$filename], UrlGeneratorInterface::ABSOLUTE_URL) . $this->publicDirectory; } }