From 7a71a06e4e3857797b7d7c16e2fc1913af83f8cc Mon Sep 17 00:00:00 2001 From: Andy Heathershaw Date: Fri, 12 Jul 2019 16:21:30 +0100 Subject: [PATCH] #123: Images are now uploaded to the storage driver specified using the new IAnalysisQueueSource interface --- app/AlbumSources/AmazonS3Source.php | 30 ++++++++++++++++++- app/AlbumSources/IAnalysisQueueSource.php | 24 +++++++++++++++ app/Helpers/AnalysisQueueHelper.php | 27 +++++++++++++++++ .../Controllers/Admin/PhotoController.php | 23 +++++++++----- 4 files changed, 96 insertions(+), 8 deletions(-) create mode 100644 app/AlbumSources/IAnalysisQueueSource.php create mode 100644 app/Helpers/AnalysisQueueHelper.php diff --git a/app/AlbumSources/AmazonS3Source.php b/app/AlbumSources/AmazonS3Source.php index 9563d18..58fe668 100644 --- a/app/AlbumSources/AmazonS3Source.php +++ b/app/AlbumSources/AmazonS3Source.php @@ -2,12 +2,13 @@ namespace App\AlbumSources; +use App\Helpers\MiscHelper; use App\Photo; use Guzzle\Http\EntityBody; use Guzzle\Http\Exception\ClientErrorResponseException; use Illuminate\Support\Facades\Log; -class AmazonS3Source extends AlbumSourceBase implements IAlbumSource +class AmazonS3Source extends AlbumSourceBase implements IAlbumSource, IAnalysisQueueSource { /** * Deletes an entire album's media contents. @@ -103,6 +104,28 @@ class AmazonS3Source extends AlbumSourceBase implements IAlbumSource $this->getClient()->upload($this->configuration->container_name, $photoPath, fopen($tempFilename, 'r+'), 'public-read'); } + /** + * Uploads a new file to the analysis queue specified by queue token. + * + * @param string $sourceFilePath Path to the file to upload to the analysis queue + * @param string $queueToken Queue token to hold the photo + * @param string $overrideFilename Use a specific filename, or false to set a specific name + * @return string Path to the file + */ + public function uploadToAnalysisQueue($sourceFilePath, $queueToken, $overrideFilename = null) + { + $targetPath = sprintf( + '%s/%s', + $this->getPathToAnalysisQueue($queueToken), + is_null($overrideFilename) ? MiscHelper::randomString(20) : $overrideFilename + ); + + // Note: we don't use "public-read" here as it will not be publicly-accessible, and will be retrieved by an authenticated client + $this->getClient()->upload($this->configuration->container_name, $targetPath, fopen($sourceFilePath, 'r+')); + + return $targetPath; + } + private function getClient() { $config = [ @@ -127,6 +150,11 @@ class AmazonS3Source extends AlbumSourceBase implements IAlbumSource return '_originals'; } + private function getPathToAnalysisQueue($queueToken) + { + return sprintf('analysis-queue/%s', $queueToken); + } + private function getPathToPhoto(Photo $photo, $thumbnail = null) { return sprintf( diff --git a/app/AlbumSources/IAnalysisQueueSource.php b/app/AlbumSources/IAnalysisQueueSource.php new file mode 100644 index 0000000..b5ec3b5 --- /dev/null +++ b/app/AlbumSources/IAnalysisQueueSource.php @@ -0,0 +1,24 @@ +source); + + /** @var IAnalysisQueueSource $source */ + $source = new $fullClassName; + $source->setConfiguration($queueStorage); + + return $source; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Admin/PhotoController.php b/app/Http/Controllers/Admin/PhotoController.php index 36bf457..6579636 100644 --- a/app/Http/Controllers/Admin/PhotoController.php +++ b/app/Http/Controllers/Admin/PhotoController.php @@ -7,6 +7,7 @@ use App\AlbumSources\IAlbumSource; use App\Facade\Image; use App\Facade\Theme; use App\Facade\UserConfig; +use App\Helpers\AnalysisQueueHelper; use App\Helpers\FileHelper; use App\Helpers\ImageHelper; use App\Helpers\MiscHelper; @@ -16,6 +17,7 @@ use App\Photo; use App\QueueItem; use App\Services\PhotoService; use App\Services\RabbitMQService; +use App\Storage; use App\Upload; use App\UploadPhoto; use App\User; @@ -298,7 +300,7 @@ class PhotoController extends Controller throw new \Exception('No queue_token value was provided!'); } - $queueFolder = FileHelper::getQueuePath($queueUid); + $queueStorage = AnalysisQueueHelper::getStorageQueueSource(); foreach ($photoFiles as $photoFile) { @@ -316,26 +318,33 @@ class PhotoController extends Controller $photo->raw_exif_data = null; /** @var File $savedFile */ + $queueFolder = FileHelper::getQueuePath($queueUid); $savedFile = FileHelper::saveUploadedFile($photoFile, $queueFolder, $photo->storage_file_name); $this->removeExistingActivityRecords($photo, 'photo.uploaded'); $this->removeExistingActivityRecords($photo, 'photo.taken'); + + $photo->file_name = $photoFile->getClientOriginalName(); + $photo->mime_type = $savedFile->getMimeType(); + $photo->file_size = $savedFile->getSize(); + $photo->storage_file_name = $savedFile->getFilename(); } else { - /** @var File $savedFile */ - $savedFile = FileHelper::saveUploadedFile($photoFile, $queueFolder); + $queuedFileName = $queueStorage->uploadToAnalysisQueue($photoFile, $queueUid); + $uploadedTempFile = new File($photoFile); $photo = new Photo(); $photo->album_id = $album->id; $photo->user_id = Auth::user()->id; $photo->name = pathinfo($photoFile->getClientOriginalName(), PATHINFO_FILENAME); - $photo->storage_file_name = $savedFile->getFilename(); + + $photo->file_name = $photoFile->getClientOriginalName(); + $photo->mime_type = $uploadedTempFile->getMimeType(); + $photo->file_size = $uploadedTempFile->getSize(); + $photo->storage_file_name = basename($queuedFileName); } - $photo->file_name = $photoFile->getClientOriginalName(); - $photo->mime_type = $savedFile->getMimeType(); - $photo->file_size = $savedFile->getSize(); $photo->is_analysed = false; $photo->save();