Spaces:
No application file
No application file
| namespace Mautic\CoreBundle\Helper; | |
| use Mautic\CoreBundle\Exception\FilePathException; | |
| use Symfony\Component\Filesystem\Exception\IOException; | |
| use Symfony\Component\Filesystem\Filesystem; | |
| use Symfony\Component\HttpFoundation\File\UploadedFile; | |
| class FilePathResolver | |
| { | |
| public function __construct( | |
| private Filesystem $filesystem, | |
| private InputHelper $inputHelper | |
| ) { | |
| } | |
| /** | |
| * @param string $uploadDir | |
| * | |
| * @throws FilePathException | |
| */ | |
| public function getUniqueFileName($uploadDir, UploadedFile $file): string | |
| { | |
| $inputHelper = $this->inputHelper; | |
| $fullName = $file->getClientOriginalName(); | |
| $fullNameSanitized = $inputHelper::filename($fullName); | |
| $ext = $this->getFileExtension($file); | |
| $baseFileName = pathinfo($fullNameSanitized, PATHINFO_FILENAME); | |
| $name = $baseFileName; | |
| $filePath = $this->getFilePath($uploadDir, $baseFileName, $ext); | |
| $i = 1; | |
| while ($this->filesystem->exists($filePath)) { | |
| $name = $baseFileName.'-'.$i; | |
| $filePath = $this->getFilePath($uploadDir, $name, $ext); | |
| ++$i; | |
| if ($i > 1000) { | |
| throw new FilePathException('Could not generate path'); | |
| } | |
| } | |
| return $name.$ext; | |
| } | |
| /** | |
| * @param string $directory | |
| * | |
| * @throws FilePathException | |
| */ | |
| public function createDirectory($directory): void | |
| { | |
| if ($this->filesystem->exists($directory)) { | |
| return; | |
| } | |
| try { | |
| $this->filesystem->mkdir($directory); | |
| } catch (IOException) { | |
| throw new FilePathException('Could not create directory'); | |
| } | |
| } | |
| /** | |
| * @param string $path | |
| */ | |
| public function delete($path): void | |
| { | |
| if (!$this->filesystem->exists($path)) { | |
| return; | |
| } | |
| try { | |
| $this->filesystem->remove($path); | |
| } catch (IOException) { | |
| } | |
| } | |
| public function move(string $originPath, string $targetPath): void | |
| { | |
| $this->filesystem->rename($originPath, $targetPath); | |
| } | |
| /** | |
| * @param string $uploadDir | |
| * @param string $fileName | |
| * @param string $ext | |
| */ | |
| private function getFilePath($uploadDir, $fileName, $ext): string | |
| { | |
| return $uploadDir.DIRECTORY_SEPARATOR.$fileName.$ext; | |
| } | |
| private function getFileExtension(UploadedFile $file): string | |
| { | |
| $ext = $file->getClientOriginalExtension(); | |
| return ('' === $ext ? '' : '.').$ext; | |
| } | |
| } | |