- zip implementation for users

This commit is contained in:
Peter Papp
2020-12-13 17:49:44 +01:00
parent 874b4bb768
commit 11873d06ff
16 changed files with 335 additions and 129 deletions

View File

@@ -3,11 +3,13 @@
namespace App\Console;
use App\Console\Commands\Deploy;
// use App\Console\Commands\SetupDevelopmentEnvironment;
use App\Console\Commands\SetupDevEnvironment;
use App\Console\Commands\SetupProductionEnvironment;
use App\Console\Commands\UpgradeApp;
use App\Share;
use App\Zip;
use Carbon\Carbon;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
@@ -36,6 +38,10 @@ class Kernel extends ConsoleKernel
$this->delete_expired_shared_links();
})->everyMinute();
$schedule->call(function () {
$this->delete_old_zips();
})->everySixHours();
// Run queue jobs every minute
$schedule->command('queue:work --tries=3')
->everyMinute()
@@ -54,6 +60,24 @@ class Kernel extends ConsoleKernel
require base_path('routes/console.php');
}
/**
* Delete old zips
*/
protected function delete_old_zips(): void
{
// Get all zips
$zips = Zip::where('created_at', '<=', Carbon::now()->subDay()->toDateTimeString())->get();
$zips->each(function ($zip) {
// Delete zip file
\Storage::disk('local')->delete('zip/' . $zip->basename);
// Delete zip record
$zip->delete();
});
}
/**
* Get and delete expired shared links
*/

View File

@@ -3,9 +3,11 @@
namespace App\Http\Controllers;
use App\FileManagerFolder;
use App\Http\Tools\Editor;
use App\Http\Tools\Guardian;
use App\Share;
use App\User;
use App\Zip;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
@@ -14,7 +16,11 @@ use Illuminate\Http\Request;
use App\FileManagerFile;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Illuminate\Http\Exceptions\HttpResponseException;
use Madnest\Madzipper\Facades\Madzipper;
use Response;
use League\Flysystem\FileNotFoundException;
use Symfony\Component\HttpKernel\Exception\HttpException;
class FileAccessController extends Controller
{
@@ -86,11 +92,36 @@ class FileAccessController extends Controller
}
// Store user download size
$request->user()->record_download((int) $file->getRawOriginal('filesize'));
$request->user()->record_download((int)$file->getRawOriginal('filesize'));
return $this->download_file($file);
}
/**
* Get generated zip for user
*
* @param $id
* @return \Symfony\Component\HttpFoundation\StreamedResponse
*/
public function get_zip($id)
{
$zip = Zip::where('id', $id)
->where('user_id', Auth::id())
->first();
$zip_path = 'zip/' . $zip->basename;
$header = [
"Content-Type" => 'application/zip',
"Content-Length" => Storage::size($zip_path),
"Accept-Ranges" => "bytes",
"Content-Range" => "bytes 0-600/" . Storage::size($zip_path),
"Content-Disposition" => "attachment; filename=" . $zip->basename,
];
return Storage::download($zip_path, $zip->basename, $header);
}
/**
* Get file public
*
@@ -118,7 +149,7 @@ class FileAccessController extends Controller
$this->check_file_access($shared, $file);
// Store user download size
User::find($shared->user_id)->record_download((int) $file->getRawOriginal('filesize'));
User::find($shared->user_id)->record_download((int)$file->getRawOriginal('filesize'));
return $this->download_file($file);
}

View File

@@ -10,6 +10,7 @@ use App\Http\Requests\FileFunctions\UploadRequest;
use App\Http\Tools\Demo;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use App\Http\Tools\Guardian;
@@ -175,7 +176,7 @@ class EditItemsController extends Controller
return Demo::response_204();
}
foreach($request->input('data') as $file){
foreach ($request->input('data') as $file) {
$unique_id = $file['unique_id'];
// Check permission to delete item for authenticated editor
@@ -204,9 +205,9 @@ class EditItemsController extends Controller
// Delete item
Editor::delete_item($file, $unique_id);
// Return response
// Return response
}
return response(null, 204);
return response(null, 204);
}
/**
@@ -232,7 +233,7 @@ class EditItemsController extends Controller
// Check shared permission
if (!is_editor($shared)) abort(403);
foreach($request->input('data') as $file){
foreach ($request->input('data') as $file) {
$unique_id = $file['unique_id'];
// Get file|folder item
@@ -316,6 +317,28 @@ class EditItemsController extends Controller
return $new_file;
}
/**
* User download multiple files via zip
*
* @param Request $request
* @return string
*/
public function user_zip_multiple_files(Request $request)
{
// Get requested files
$files = FileManagerFile::whereUserId(Auth::id())
->whereIn('unique_id', $request->input('files'))
->get();
$zip = Editor::zip_files($files);
// Get file
return response([
'url' => route('zip', $zip->id),
'name' => $zip->basename,
], 200);
}
/**
* Move item for authenticated master|editor user
*
@@ -341,7 +364,7 @@ class EditItemsController extends Controller
$shared = get_shared($request->cookie('shared_token'));
// Check access to requested directory
Guardian::check_item_access($to_unique_id, $shared);
Guardian::check_item_access($to_unique_id, $shared);
}
// Move item
@@ -374,7 +397,7 @@ class EditItemsController extends Controller
// Check shared permission
if (!is_editor($shared)) abort(403);
foreach($request->input('items') as $item) {
foreach ($request->input('items') as $item) {
$unique_id = $item['unique_id'];
$moving_unique_id = $unique_id;

View File

@@ -8,6 +8,7 @@ use App\FileManagerFile;
use App\FileManagerFolder;
use App\Http\Requests\FileFunctions\RenameItemRequest;
use App\User;
use App\Zip;
use Aws\Exception\MultipartUploadException;
use Aws\S3\MultipartUploader;
use Carbon\Carbon;
@@ -18,11 +19,81 @@ use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Intervention\Image\ImageManagerStatic as Image;
use League\Flysystem\FileNotFoundException;
use Madnest\Madzipper\Facades\Madzipper;
use Symfony\Component\HttpKernel\Exception\HttpException;
class Editor
{
/**
* Zip selected files, store it in /zip folder and retrieve zip record
*
* @param $files
* @return mixed
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public static function zip_files($files)
{
// Local storage instance
$disk_local = Storage::disk('local');
// Create zip directory
if (!$disk_local->exists('zip')) {
$disk_local->makeDirectory('zip');
}
// Move file to local storage from external storage service
if (!is_storage_driver('local')) {
// Create temp directory
if (!$disk_local->exists('temp')) {
$disk_local->makeDirectory('temp');
}
foreach ($files as $file) {
try {
$disk_local->put('temp/' . $file['basename'], Storage::get('file-manager/' . $file['basename']));
} catch (FileNotFoundException $e) {
throw new HttpException(404, 'File not found');
}
}
}
// Get zip path
$zip_name = Str::random(16) . '.zip';
$zip_path = 'zip/' . $zip_name;
// Create zip
$zip = Madzipper::make(storage_path() . '/app/' . $zip_path);
// Get files folder on local storage drive
$files_directory = is_storage_driver('local') ? 'file-manager' : 'temp';
// Add files to zip
$files->each(function ($file) use ($zip, $files_directory) {
$zip->addString($file['name'], File::get(storage_path() . '/app/' . $files_directory . '/' . $file['basename']));
});
// Close zip
$zip->close();
// Delete temporary files
if (!is_storage_driver('local')) {
$files->each(function ($file) use ($disk_local) {
$disk_local->delete('temp/' . $file['basename']);
});
}
// Store zip record
return Zip::create([
'user_id' => Auth::id(),
'basename' => $zip_name,
]);
}
/**
* Create new directory
*
@@ -206,7 +277,7 @@ class Editor
// Get user id
$user_id = is_null($shared) ? Auth::id() : $shared->user_id;
foreach($request->input('items') as $item) {
foreach ($request->input('items') as $item) {
$unique_id = $item['unique_id'];
if ($item['type'] === 'folder') {
@@ -309,8 +380,8 @@ class Editor
];
// Store user upload size
if($request->user()){
if ($request->user()) {
// If upload a loged user
$request->user()->record_upload($file_size);

27
app/Zip.php Normal file
View File

@@ -0,0 +1,27 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
class Zip extends Model
{
protected $guarded = ['id'];
public $incrementing = false;
protected $keyType = 'string';
/**
* Generate uuid
*/
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->id = (string)Str::uuid();
});
}
}