From 7f4eaa68255749ad1c4e1c66dfafcf220ce6a248 Mon Sep 17 00:00:00 2001 From: Ramon Gutierrez Date: Wed, 17 Jan 2018 02:04:46 +0800 Subject: [PATCH] Add uploads cleanup console command --- composer.json | 1 + composer.lock | 22 ++++---- src/Command/UploadCleanupCommand.php | 84 ++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 src/Command/UploadCleanupCommand.php diff --git a/composer.json b/composer.json index 7142de86..9312815f 100644 --- a/composer.json +++ b/composer.json @@ -9,6 +9,7 @@ "sensio/framework-extra-bundle": "^5.1", "symfony/console": "^4.0", "symfony/debug": "^4.0", + "symfony/filesystem": "^4.0", "symfony/flex": "^1.0", "symfony/framework-bundle": "^4.0", "symfony/lts": "^4@dev", diff --git a/composer.lock b/composer.lock index a37731c6..f3e55683 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "76c7ab30aaf88fded46189060d30a852", + "content-hash": "5f0891f0acd5a0d27efb15cbb37c7041", "packages": [ { "name": "creof/doctrine2-spatial", @@ -2266,16 +2266,16 @@ }, { "name": "symfony/filesystem", - "version": "v4.0.2", + "version": "v4.0.3", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "8c2868641d0c4885eee9c12a89c2b695eb1985cd" + "reference": "760e47a4ee64b4c48f4b30017011e09d4c0f05ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/8c2868641d0c4885eee9c12a89c2b695eb1985cd", - "reference": "8c2868641d0c4885eee9c12a89c2b695eb1985cd", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/760e47a4ee64b4c48f4b30017011e09d4c0f05ed", + "reference": "760e47a4ee64b4c48f4b30017011e09d4c0f05ed", "shasum": "" }, "require": { @@ -2311,20 +2311,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2017-12-14T19:48:22+00:00" + "time": "2018-01-03T07:38:00+00:00" }, { "name": "symfony/finder", - "version": "v4.0.2", + "version": "v4.0.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "c9cdda4dc4a3182d8d6daeebce4a25fef078ea4c" + "reference": "8b08180f2b7ccb41062366b9ad91fbc4f1af8601" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/c9cdda4dc4a3182d8d6daeebce4a25fef078ea4c", - "reference": "c9cdda4dc4a3182d8d6daeebce4a25fef078ea4c", + "url": "https://api.github.com/repos/symfony/finder/zipball/8b08180f2b7ccb41062366b9ad91fbc4f1af8601", + "reference": "8b08180f2b7ccb41062366b9ad91fbc4f1af8601", "shasum": "" }, "require": { @@ -2360,7 +2360,7 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2017-11-07T14:45:01+00:00" + "time": "2018-01-03T07:38:00+00:00" }, { "name": "symfony/flex", diff --git a/src/Command/UploadCleanupCommand.php b/src/Command/UploadCleanupCommand.php new file mode 100644 index 00000000..36de2bd4 --- /dev/null +++ b/src/Command/UploadCleanupCommand.php @@ -0,0 +1,84 @@ +object_manager = $om; + $this->filesystem = $fs; + $this->uploader = $uploader; + + parent::__construct(); + } + + protected function configure() + { + $this->setName('upload:cleanup') + ->setDescription('Clean up uploads folder.') + ->setHelp('Cleans up all orphaned files from the uploads folder.'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $output->writeln('Retrieving file whitelist...'); + + // get all image filenames + $em = $this->object_manager; + $rows = $em->getRepository(Rider::class)->findAll(); + $whitelist = ['.gitkeep']; + + if (!empty($rows)) { + foreach ($rows as $row) { + $image = $row->getImageFile(); + + if (!empty($image)) { + $whitelist[] = $image; + } + } + } + + $directory = $this->uploader->getTargetDir(); + + // get all files in folder + $files = new DirectoryIterator($directory); + + $i = 0; + + // delete all files that are not linked + foreach ($files as $file) { + $filename = $file->getFilename(); + + if (!in_array($filename, $whitelist) && $file->isFile()) { + try { + $this->filesystem->remove($directory . '/' . $filename); + } catch (IOExceptionInterface $e) { + $output->writeln('An error occurred while deleting the file "' . $filename . '"!'); + } + + $i++; + } + } + + if ($i > 0) + $output->writeln('Deleted ' . $i . ' orphaned file(s). Done!'); + else + $output->writeln('No files found. Done!'); + } +}