Created
July 23, 2018 12:56
-
-
Save UnderDogg/87596c562aa952dbab071a3665d6b6e3 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 hidden or 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 hidden or 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 hidden or 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