multipart upload

This commit is contained in:
carodej
2020-07-28 16:57:54 +02:00
parent fe8e329fea
commit 9fea65bd52
6 changed files with 106 additions and 47 deletions
+11
View File
@@ -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 * Get storage usage in percent
* *
+84 -42
View File
@@ -8,12 +8,16 @@ use App\FileManagerFile;
use App\FileManagerFolder; use App\FileManagerFolder;
use App\Http\Requests\FileFunctions\RenameItemRequest; use App\Http\Requests\FileFunctions\RenameItemRequest;
use App\User; use App\User;
use Aws\Exception\MultipartUploadException;
use Aws\S3\MultipartUploader;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Intervention\Image\ImageManagerStatic as Image; use Intervention\Image\ImageManagerStatic as Image;
use Symfony\Component\HttpKernel\Exception\HttpException;
class Editor 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 * 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 string $filename
* @param $unique_id * @param string|null $thumbnail
* @param null $shared
*/ */
public static function move($request, $unique_id, $shared = null) private static function move_to_external_storage(string $filename, ?string $thumbnail): void
{ {
// Get user id foreach ([$filename, $thumbnail] as $file) {
$user_id = is_null($shared) ? Auth::id() : $shared->user_id;
if ($request->from_type === 'folder') { // Check if file exist
if (!$file) continue;
// Move folder // Get file size
$item = FileManagerFolder::where('user_id', $user_id) $filesize = Storage::disk('local')->size('file-manager/' . $filename);
->where('unique_id', $unique_id)
->firstOrFail();
$item->update([ // If file is bigger than 5.2MB then run multipart upload
'parent_id' => $request->to_unique_id if ($filesize > 5242880) {
// Get driver
$driver = \Storage::getDriver();
// Get adapter
$adapter = $driver->getAdapter();
// 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 { } else {
// Move file under new folder // Stream file object to s3
$item = FileManagerFile::where('user_id', $user_id) Storage::putFileAs('/file-manager', storage_path() . '/app/file-manager/' . $file, $file, 'private');
->where('unique_id', $unique_id) }
->firstOrFail();
$item->update([ // Delete file after upload
'folder_id' => $request->to_unique_id Storage::disk('local')->delete('file-manager/' . $file);
]);
} }
} }
@@ -358,25 +421,4 @@ class Editor
return $thumbnail ?? null; 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);
}
}
} }
+4 -1
View File
@@ -2,7 +2,10 @@
return [ 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' => [ 'pages' => [
[ [
+2 -1
View File
@@ -1,4 +1,5 @@
{ {
"/js/main.js": "/js/main.js", "/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"
} }
+1 -1
View File
@@ -98,7 +98,7 @@ const Helpers = {
chunks = [] chunks = []
// Calculate ceils // Calculate ceils
let size = 1388608, let size = this.$store.getters.config.chunkSize,
chunksCeil = Math.ceil(file.size / size); chunksCeil = Math.ceil(file.size / size);
// Create chunks // Create chunks
+2
View File
@@ -58,6 +58,8 @@
installation: '{{ $installation ?? '' }}', installation: '{{ $installation ?? '' }}',
latest_upgrade: '{{ isset($settings->latest_upgrade) && $settings->latest_upgrade ? $settings->latest_upgrade : null }}', latest_upgrade: '{{ isset($settings->latest_upgrade) && $settings->latest_upgrade ? $settings->latest_upgrade : null }}',
chunkSize: {{ format_bytes(config('vuefilemanager.chunk_size')) }},
} }
</script> </script>