From 9fea65bd52ba5b996c9ea2150e52e2ff45ff9b24 Mon Sep 17 00:00:00 2001 From: carodej Date: Tue, 28 Jul 2020 16:57:54 +0200 Subject: [PATCH] multipart upload --- app/Http/Helpers/helpers.php | 11 +++ app/Http/Tools/Editor.php | 130 +++++++++++++++++++++----------- config/vuefilemanager.php | 5 +- public/mix-manifest.json | 3 +- resources/js/helpers.js | 2 +- resources/views/index.blade.php | 2 + 6 files changed, 106 insertions(+), 47 deletions(-) diff --git a/app/Http/Helpers/helpers.php b/app/Http/Helpers/helpers.php index 35f431ee..94e939f4 100644 --- a/app/Http/Helpers/helpers.php +++ b/app/Http/Helpers/helpers.php @@ -343,6 +343,17 @@ function format_gigabytes($gigabytes) } } +/** + * Convert megabytes to bytes + * + * @param $megabytes + * @return int|string + */ +function format_bytes($megabytes) +{ + return Metric::megabytes($megabytes)->numberOfBytes(); +} + /** * Get storage usage in percent * diff --git a/app/Http/Tools/Editor.php b/app/Http/Tools/Editor.php index a1b55eee..49eafa14 100644 --- a/app/Http/Tools/Editor.php +++ b/app/Http/Tools/Editor.php @@ -8,12 +8,16 @@ use App\FileManagerFile; use App\FileManagerFolder; use App\Http\Requests\FileFunctions\RenameItemRequest; use App\User; +use Aws\Exception\MultipartUploadException; +use Aws\S3\MultipartUploader; use Illuminate\Support\Arr; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\File; +use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; use Intervention\Image\ImageManagerStatic as Image; +use Symfony\Component\HttpKernel\Exception\HttpException; class Editor @@ -188,6 +192,42 @@ class Editor } } + /** + * Move folder or file to new location + * + * @param $request + * @param $unique_id + * @param null $shared + */ + public static function move($request, $unique_id, $shared = null) + { + // Get user id + $user_id = is_null($shared) ? Auth::id() : $shared->user_id; + + if ($request->from_type === 'folder') { + + // Move folder + $item = FileManagerFolder::where('user_id', $user_id) + ->where('unique_id', $unique_id) + ->firstOrFail(); + + $item->update([ + 'parent_id' => $request->to_unique_id + ]); + + } else { + + // Move file under new folder + $item = FileManagerFile::where('user_id', $user_id) + ->where('unique_id', $unique_id) + ->firstOrFail(); + + $item->update([ + 'folder_id' => $request->to_unique_id + ]); + } + } + /** * Upload file * @@ -269,38 +309,61 @@ class Editor } /** - * Move folder or file to new location + * Move file to external storage if is set * - * @param $request - * @param $unique_id - * @param null $shared + * @param string $filename + * @param string|null $thumbnail */ - public static function move($request, $unique_id, $shared = null) + private static function move_to_external_storage(string $filename, ?string $thumbnail): void { - // Get user id - $user_id = is_null($shared) ? Auth::id() : $shared->user_id; + foreach ([$filename, $thumbnail] as $file) { - if ($request->from_type === 'folder') { + // Check if file exist + if (!$file) continue; - // Move folder - $item = FileManagerFolder::where('user_id', $user_id) - ->where('unique_id', $unique_id) - ->firstOrFail(); + // Get file size + $filesize = Storage::disk('local')->size('file-manager/' . $filename); - $item->update([ - 'parent_id' => $request->to_unique_id - ]); + // If file is bigger than 5.2MB then run multipart upload + if ($filesize > 5242880) { - } else { + // Get driver + $driver = \Storage::getDriver(); - // Move file under new folder - $item = FileManagerFile::where('user_id', $user_id) - ->where('unique_id', $unique_id) - ->firstOrFail(); + // Get adapter + $adapter = $driver->getAdapter(); - $item->update([ - 'folder_id' => $request->to_unique_id - ]); + // Get client + $client = $adapter->getClient(); + + // Prepare the upload parameters. + $uploader = new MultipartUploader($client, storage_path() . '/app/file-manager/' . $file, [ + 'bucket' => $adapter->getBucket(), + 'key' => 'file-manager/' . $file + ]); + + // Upload content + try { + $uploader->upload(); + + } catch (MultipartUploadException $e) { + + Log::error($e->getMessage()); + + // Delete file after error + Storage::disk('local')->delete('file-manager/' . $file); + + throw new HttpException(409, $e->getMessage()); + } + + } else { + + // Stream file object to s3 + Storage::putFileAs('/file-manager', storage_path() . '/app/file-manager/' . $file, $file, 'private'); + } + + // Delete file after upload + Storage::disk('local')->delete('file-manager/' . $file); } } @@ -358,25 +421,4 @@ class Editor return $thumbnail ?? null; } - - /** - * Move file to external storage if is set - * - * @param string $filename - * @param string|null $thumbnail - */ - private static function move_to_external_storage(string $filename, ?string $thumbnail): void - { - foreach ([$filename, $thumbnail] as $file) { - - // Check if file exist - if (!$file) continue; - - // Move file - Storage::putFileAs('/file-manager', storage_path() . '/app/file-manager/' . $file, $file, 'private'); - - // Delete file after upload - Storage::disk('local')->delete('file-manager/' . $file); - } - } } \ No newline at end of file diff --git a/config/vuefilemanager.php b/config/vuefilemanager.php index 556320ad..570823ee 100644 --- a/config/vuefilemanager.php +++ b/config/vuefilemanager.php @@ -2,7 +2,10 @@ return [ - 'version' => '1.7', + 'version' => '1.7.3', + + // Define size of chunk uploaded by MB. E.g. integer 128 means chunk size will be 128MB. + 'chunk_size' => '128', 'pages' => [ [ diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 84307b4c..b16aa666 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,4 +1,5 @@ { "/js/main.js": "/js/main.js", - "/css/app.css": "/css/app.css" + "/css/app.css": "/css/app.css", + "/js/main.2a26d6321a7d4c8431ce.hot-update.js": "/js/main.2a26d6321a7d4c8431ce.hot-update.js" } diff --git a/resources/js/helpers.js b/resources/js/helpers.js index 009d0963..5f53da32 100644 --- a/resources/js/helpers.js +++ b/resources/js/helpers.js @@ -98,7 +98,7 @@ const Helpers = { chunks = [] // Calculate ceils - let size = 1388608, + let size = this.$store.getters.config.chunkSize, chunksCeil = Math.ceil(file.size / size); // Create chunks diff --git a/resources/views/index.blade.php b/resources/views/index.blade.php index 4e672cfe..8641e2ba 100644 --- a/resources/views/index.blade.php +++ b/resources/views/index.blade.php @@ -58,6 +58,8 @@ installation: '{{ $installation ?? '' }}', latest_upgrade: '{{ isset($settings->latest_upgrade) && $settings->latest_upgrade ? $settings->latest_upgrade : null }}', + + chunkSize: {{ format_bytes(config('vuefilemanager.chunk_size')) }}, }