diff --git a/src/App/Users/Actions/CheckStorageCapacityAction.php b/src/App/Users/Actions/CheckStorageCapacityAction.php new file mode 100644 index 00000000..59f6e2ae --- /dev/null +++ b/src/App/Users/Actions/CheckStorageCapacityAction.php @@ -0,0 +1,33 @@ += 100) { + // Delete file + Storage::disk('local') + ->delete("chunks/$temp_filename"); + + // Abort uploading + // TODO: test pre exceed storage limit + abort(423, 'You exceed your storage limit!'); + } + } +} \ No newline at end of file diff --git a/src/Domain/Files/Actions/CreateImageThumbnailAction.php b/src/Domain/Files/Actions/CreateImageThumbnailAction.php new file mode 100644 index 00000000..c82a263d --- /dev/null +++ b/src/Domain/Files/Actions/CreateImageThumbnailAction.php @@ -0,0 +1,48 @@ +mimeType($file_path), $availableFormats)) { + // Get thumbnail name + $thumbnail = "thumbnail-$filename"; + + // Create intervention image + $image = Image::make(Storage::disk('local')->path($file_path)) + ->orientate(); + + // Resize image + $image->resize(512, null, function ($constraint) { + $constraint->aspectRatio(); + })->stream(); + + // Store thumbnail to disk + Storage::put("files/$user_id/$thumbnail", $image); + } + + // Return thumbnail as svg file + if (Storage::disk('local')->mimeType($file_path) === 'image/svg+xml') { + $thumbnail = $filename; + } + + return $thumbnail ?? null; + } +} \ No newline at end of file diff --git a/src/Domain/Files/Actions/MoveFileToExternalStorageAction.php b/src/Domain/Files/Actions/MoveFileToExternalStorageAction.php new file mode 100644 index 00000000..0f2b5376 --- /dev/null +++ b/src/Domain/Files/Actions/MoveFileToExternalStorageAction.php @@ -0,0 +1,66 @@ +size("files/$user_id/$file"); + + // If file is bigger than 5.2MB then run multipart upload + if ($filesize > 5242880) { + // Get driver + $driver = \Storage::getDriver(); + + // Get adapter + $adapter = $driver->getAdapter(); + + // Get client + $client = $adapter->getClient(); + + // Prepare the upload parameters. + // TODO: replace local files with temp folder + $uploader = new MultipartUploader($client, config('filesystems.disks.local.root') . "/files/$user_id/$file", [ + 'bucket' => $adapter->getBucket(), + 'key' => "files/$user_id/$file", + ]); + + try { + // Upload content + $uploader->upload(); + } catch (MultipartUploadException $e) { + // Write error log + Log::error($e->getMessage()); + + // Delete file after error + $disk_local->delete("files/$user_id/$file"); + + throw new HttpException(409, $e->getMessage()); + } + } else { + // Stream file object to s3 + // TODO: replace local files with temp folder + Storage::putFileAs("files/$user_id", config('filesystems.disks.local.root') . "/files/$user_id/$file", $file, 'private'); + } + + // Delete file after upload + $disk_local->delete("files/$user_id/$file"); + } +} \ No newline at end of file diff --git a/src/Domain/Files/Actions/UploadFileAction.php b/src/Domain/Files/Actions/UploadFileAction.php index c0ae00ff..c5261043 100644 --- a/src/Domain/Files/Actions/UploadFileAction.php +++ b/src/Domain/Files/Actions/UploadFileAction.php @@ -1,8 +1,8 @@ mimeType("chunks/$temp_filename"); // Check if user has enough space to upload file - $this->helper->check_user_storage_capacity($user_id, $file_size, $temp_filename); + ($this->checkStorageCapacity)($user_id, $file_size, $temp_filename); // Create thumbnail - $thumbnail = $this->helper->create_image_thumbnail("chunks/$temp_filename", $disk_file_name, $user_id); + $thumbnail = ($this->createImageThumbnail)("chunks/$temp_filename", $disk_file_name, $user_id); // Move finished file from chunk to file-manager directory $disk_local->move("chunks/$temp_filename", "files/$user_id/$disk_file_name"); // Move files to external storage if (! is_storage_driver(['local'])) { - $this->helper->move_file_to_external_storage($disk_file_name, $user_id); + ($this->moveFileToExternalStorage)($disk_file_name, $user_id); } // Store user upload size diff --git a/src/Support/Services/HelperService.php b/src/Support/Services/HelperService.php index 3e0c070c..76f6e469 100644 --- a/src/Support/Services/HelperService.php +++ b/src/Support/Services/HelperService.php @@ -68,119 +68,6 @@ class HelperService } } - /** - * Check if user has enough space to upload file - * - * @param $user_id - * @param int $file_size - * @param $temp_filename - */ - public function check_user_storage_capacity($user_id, int $file_size, $temp_filename): void - { - // Get user storage percentage and get storage_limitation setting - $user_storage_used = user_storage_percentage($user_id, $file_size); - - // Check if user can upload - if (get_setting('storage_limitation') && $user_storage_used >= 100) { - // Delete file - Storage::disk('local') - ->delete("chunks/$temp_filename"); - - // Abort uploading - // TODO: test pre exceed storage limit - abort(423, 'You exceed your storage limit!'); - } - } - - /** - * Move file to external storage if is set - * - * @param string $file - * @param string $user_id - */ - public function move_file_to_external_storage($file, $user_id): void - { - $disk_local = \Storage::disk('local'); - - // Get file size - $filesize = $disk_local->size("files/$user_id/$file"); - - // If file is bigger than 5.2MB then run multipart upload - if ($filesize > 5242880) { - // Get driver - $driver = \Storage::getDriver(); - - // Get adapter - $adapter = $driver->getAdapter(); - - // Get client - $client = $adapter->getClient(); - - // Prepare the upload parameters. - // TODO: replace local files with temp folder - $uploader = new MultipartUploader($client, config('filesystems.disks.local.root') . "/files/$user_id/$file", [ - 'bucket' => $adapter->getBucket(), - 'key' => "files/$user_id/$file", - ]); - - try { - // Upload content - $uploader->upload(); - } catch (MultipartUploadException $e) { - // Write error log - Log::error($e->getMessage()); - - // Delete file after error - $disk_local->delete("files/$user_id/$file"); - - throw new HttpException(409, $e->getMessage()); - } - } else { - // Stream file object to s3 - // TODO: replace local files with temp folder - Storage::putFileAs("files/$user_id", config('filesystems.disks.local.root') . "/files/$user_id/$file", $file, 'private'); - } - - // Delete file after upload - $disk_local->delete("files/$user_id/$file"); - } - - /** - * Create image thumbnail from gif, jpeg, jpg, png, webp or svg - * - * @param string $file_path - * @param string $filename - * @param string $user_id - * @return string|null - */ - public function create_image_thumbnail($file_path, $filename, $user_id) - { - // Create thumbnail from image - if (in_array(Storage::disk('local')->mimeType($file_path), ['image/gif', 'image/jpeg', 'image/jpg', 'image/png', 'image/webp'])) { - // Get thumbnail name - $thumbnail = "thumbnail-$filename"; - - // Create intervention image - $image = Image::make(Storage::disk('local')->path($file_path)) - ->orientate(); - - // Resize image - $image->resize(512, null, function ($constraint) { - $constraint->aspectRatio(); - })->stream(); - - // Store thumbnail to disk - Storage::put("files/$user_id/$thumbnail", $image); - } - - // Return thumbnail as svg file - if (Storage::disk('local')->mimeType($file_path) === 'image/svg+xml') { - $thumbnail = $filename; - } - - return $thumbnail ?? null; - } - /** * Call and download file *