Created
January 7, 2019 10:34
-
-
Save asimshazad/a84c00a22032e5820fcd4130a2a77c96 to your computer and use it in GitHub Desktop.
Laravel + Spatie Backup controller & views to see and manage DB backup files in the browser
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Http\Controllers; | |
use Alert; | |
use App\Http\Requests; | |
use Artisan; | |
use Log; | |
use Storage; | |
class BackupController extends Controller | |
{ | |
public function index() | |
{ | |
$disk = Storage::disk(config('laravel-backup.backup.destination.disks')[0]); | |
$files = $disk->files(config('laravel-backup.backup.name')); | |
$backups = []; | |
// make an array of backup files, with their filesize and creation date | |
foreach ($files as $k => $f) { | |
// only take the zip files into account | |
if (substr($f, -4) == '.zip' && $disk->exists($f)) { | |
$backups[] = [ | |
'file_path' => $f, | |
'file_name' => str_replace(config('laravel-backup.backup.name') . '/', '', $f), | |
'file_size' => $disk->size($f), | |
'last_modified' => $disk->lastModified($f), | |
]; | |
} | |
} | |
// reverse the backups, so the newest one would be on top | |
$backups = array_reverse($backups); | |
return view("backup.backups")->with(compact('backups')); | |
} | |
public function create() | |
{ | |
try { | |
// start the backup process | |
Artisan::call('backup:run'); | |
$output = Artisan::output(); | |
// log the results | |
Log::info("Backpack\BackupManager -- new backup started from admin interface \r\n" . $output); | |
// return the results as a response to the ajax call | |
Alert::success('New backup created'); | |
return redirect()->back(); | |
} catch (Exception $e) { | |
Flash::error($e->getMessage()); | |
return redirect()->back(); | |
} | |
} | |
/** | |
* Downloads a backup zip file. | |
* | |
* TODO: make it work no matter the flysystem driver (S3 Bucket, etc). | |
*/ | |
public function download($file_name) | |
{ | |
$file = config('laravel-backup.backup.name') . '/' . $file_name; | |
$disk = Storage::disk(config('laravel-backup.backup.destination.disks')[0]); | |
if ($disk->exists($file)) { | |
$fs = Storage::disk(config('laravel-backup.backup.destination.disks')[0])->getDriver(); | |
$stream = $fs->readStream($file); | |
return \Response::stream(function () use ($stream) { | |
fpassthru($stream); | |
}, 200, [ | |
"Content-Type" => $fs->getMimetype($file), | |
"Content-Length" => $fs->getSize($file), | |
"Content-disposition" => "attachment; filename=\"" . basename($file) . "\"", | |
]); | |
} else { | |
abort(404, "The backup file doesn't exist."); | |
} | |
} | |
/** | |
* Deletes a backup file. | |
*/ | |
public function delete($file_name) | |
{ | |
$disk = Storage::disk(config('laravel-backup.backup.destination.disks')[0]); | |
if ($disk->exists(config('laravel-backup.backup.name') . '/' . $file_name)) { | |
$disk->delete(config('laravel-backup.backup.name') . '/' . $file_name); | |
return redirect()->back(); | |
} else { | |
abort(404, "The backup file doesn't exist."); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@extends('layouts.default') | |
@section('content') | |
<h3>Administer Database Backups</h3> | |
<div class="row"> | |
<div class="col-xs-12 clearfix"> | |
<a id="create-new-backup-button" href="{{ url('backup/create') }}" class="btn btn-primary pull-right" | |
style="margin-bottom:2em;"><i | |
class="fa fa-plus"></i> Create New Backup | |
</a> | |
</div> | |
<div class="col-xs-12"> | |
@if (count($backups)) | |
<table class="table table-striped table-bordered"> | |
<thead> | |
<tr> | |
<th>File</th> | |
<th>Size</th> | |
<th>Date</th> | |
<th>Age</th> | |
<th></th> | |
</tr> | |
</thead> | |
<tbody> | |
@foreach($backups as $backup) | |
<tr> | |
<td>{{ $backup['file_name'] }}</td> | |
<td>{{ humanFilesize($backup['file_size']) }}</td> | |
<td> | |
{{ formatTimeStamp($backup['last_modified'], 'F jS, Y, g:ia (T)') }} | |
</td> | |
<td> | |
{{ diffTimeStamp($backup['last_modified']) }} | |
</td> | |
<td class="text-right"> | |
<a class="btn btn-xs btn-default" | |
href="{{ url('backup/download/'.$backup['file_name']) }}"><i | |
class="fa fa-cloud-download"></i> Download</a> | |
<a class="btn btn-xs btn-danger" data-button-type="delete" | |
href="{{ url('backup/delete/'.$backup['file_name']) }}"><i class="fa fa-trash-o"></i> | |
Delete</a> | |
</td> | |
</tr> | |
@endforeach | |
</tbody> | |
</table> | |
@else | |
<div class="well"> | |
<h4>There are no backups</h4> | |
</div> | |
@endif | |
</div> | |
</div> | |
@endsection |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Backup routes | |
Route::get('backup', 'BackupController@index'); | |
Route::get('backup/create', 'BackupController@create'); | |
Route::get('backup/download/{file_name}', 'BackupController@download'); | |
Route::get('backup/delete/{file_name}', 'BackupController@delete'); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment