Added image view, next/previous and view update
This commit is contained in:
parent
3361427c75
commit
c5f0bfffd0
@ -151,7 +151,7 @@ class Import extends Command
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
$po->thumbnail = exif_thumbnail($po->file_path());
|
$po->thumbnail = exif_thumbnail($po->file_path());
|
||||||
} catch (Exception $e) {
|
} catch (\Exception $e) {
|
||||||
// @todo Couldnt get the thumbnail, so we should create one.
|
// @todo Couldnt get the thumbnail, so we should create one.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,19 @@ class PhotoController extends Controller
|
|||||||
$this->middleware('guest');
|
$this->middleware('guest');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function delete($id)
|
||||||
|
{
|
||||||
|
$po = Photo::notRemove()->findOrFail($id);
|
||||||
|
|
||||||
|
if ($po)
|
||||||
|
{
|
||||||
|
$po->remove = TRUE;
|
||||||
|
$po->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect()->action('PhotoController@info',[$id]);
|
||||||
|
}
|
||||||
|
|
||||||
public function info($id)
|
public function info($id)
|
||||||
{
|
{
|
||||||
return view('photo.view', ['photo'=> Photo::findOrFail($id)]);
|
return view('photo.view', ['photo'=> Photo::findOrFail($id)]);
|
||||||
@ -26,6 +39,24 @@ class PhotoController extends Controller
|
|||||||
|
|
||||||
public function thumbnail($id)
|
public function thumbnail($id)
|
||||||
{
|
{
|
||||||
return (new Response(Photo::findOrFail($id)->thumbnail()))->header('Content-Type','image/jpg');
|
return response(Photo::findOrFail($id)->thumbnail(TRUE))->header('Content-Type','image/jpeg');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function undelete($id)
|
||||||
|
{
|
||||||
|
$po = Photo::findOrFail($id);
|
||||||
|
|
||||||
|
if ($po)
|
||||||
|
{
|
||||||
|
$po->remove = NULL;
|
||||||
|
$po->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect()->action('PhotoController@info',[$id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function view($id)
|
||||||
|
{
|
||||||
|
return response(Photo::findOrFail($id)->image())->header('Content-Type','image/jpeg');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,3 +21,6 @@ Route::auth();
|
|||||||
|
|
||||||
Route::get('/info/{id}', 'PhotoController@info')->where('id', '[0-9]+');;
|
Route::get('/info/{id}', 'PhotoController@info')->where('id', '[0-9]+');;
|
||||||
Route::get('/thumbnail/{id}', 'PhotoController@thumbnail')->where('id', '[0-9]+');;
|
Route::get('/thumbnail/{id}', 'PhotoController@thumbnail')->where('id', '[0-9]+');;
|
||||||
|
Route::get('/view/{id}', 'PhotoController@view')->where('id', '[0-9]+');;
|
||||||
|
Route::post('/delete/{id}', 'PhotoController@delete')->where('id', '[0-9]+');;
|
||||||
|
Route::post('/undelete/{id}', 'PhotoController@undelete')->where('id', '[0-9]+');;
|
||||||
|
@ -77,6 +77,20 @@ class Photo extends Model
|
|||||||
return ($this->gps_lat AND $this->gps_lon) ? sprintf('%s/%s',$this->gps_lat,$this->gps_lon) : 'UNKNOWN';
|
return ($this->gps_lat AND $this->gps_lon) ? sprintf('%s/%s',$this->gps_lat,$this->gps_lon) : 'UNKNOWN';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the image, rotated, minus exif data
|
||||||
|
*/
|
||||||
|
public function image() {
|
||||||
|
$imo = $this->io();
|
||||||
|
|
||||||
|
if (array_key_exists('exif',$imo->getImageProfiles()))
|
||||||
|
$imo->removeImageProfile('exif');
|
||||||
|
|
||||||
|
$this->rotate($imo);
|
||||||
|
|
||||||
|
return $imo->getImageBlob();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return an Imagick object or attribute
|
* Return an Imagick object or attribute
|
||||||
*
|
*
|
||||||
@ -146,6 +160,17 @@ class Photo extends Model
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the id of the previous photo
|
||||||
|
*/
|
||||||
|
public function next()
|
||||||
|
{
|
||||||
|
$po = DB::table('photo');
|
||||||
|
$po->where('id','>',$this->id);
|
||||||
|
$po->orderby('id','ASC');
|
||||||
|
return $po->first();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rotate the image
|
* Rotate the image
|
||||||
*
|
*
|
||||||
@ -158,10 +183,43 @@ class Photo extends Model
|
|||||||
return $imo->getImageBlob();
|
return $imo->getImageBlob();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function path($path) {
|
public static function path($path)
|
||||||
|
{
|
||||||
return preg_replace('/^\//','',str_replace(config('photo.dir'),'',$path));
|
return preg_replace('/^\//','',str_replace(config('photo.dir'),'',$path));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the id of the previous photo
|
||||||
|
*/
|
||||||
|
public function previous()
|
||||||
|
{
|
||||||
|
$po = DB::table('photo');
|
||||||
|
$po->where('id','<',$this->id);
|
||||||
|
$po->orderby('id','DEC');
|
||||||
|
return $po->first();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the photo size
|
||||||
|
*/
|
||||||
|
public function size()
|
||||||
|
{
|
||||||
|
return filesize($this->file_path());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the photo signature
|
||||||
|
*/
|
||||||
|
public function signature($short=FALSE)
|
||||||
|
{
|
||||||
|
return $short ? static::signaturetrim($this->io()->getImageSignature()) : $this->io()->getImageSignature();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function signaturetrim($signature,$chars=6)
|
||||||
|
{
|
||||||
|
return sprintf('%s...%s',substr($signature,0,$chars),substr($signature,-1*$chars));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine if the image should be moved
|
* Determine if the image should be moved
|
||||||
*/
|
*/
|
||||||
@ -177,7 +235,9 @@ class Photo extends Model
|
|||||||
public function thumbnail($rotate=TRUE)
|
public function thumbnail($rotate=TRUE)
|
||||||
{
|
{
|
||||||
if (! $this->thumbnail)
|
if (! $this->thumbnail)
|
||||||
return NULL;
|
{
|
||||||
|
return $this->io()->thumbnailimage(200,200,true,true) ? $this->io()->getImageBlob() : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (! $rotate OR ! array_key_exists($this->orientation,$this->_rotate) OR ! extension_loaded('imagick'))
|
if (! $rotate OR ! array_key_exists($this->orientation,$this->_rotate) OR ! extension_loaded('imagick'))
|
||||||
return $this->thumbnail;
|
return $this->thumbnail;
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
<title>Laravel</title>
|
<title>Photo</title>
|
||||||
|
|
||||||
<!-- Fonts -->
|
<!-- Fonts -->
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css" integrity="sha384-XdYbMnZ/QjLh6iI4ogqCTaIjrFk87ip+ekIjefZch0Y+PvJ8CDYtEs1ipDmPorQ+" crossorigin="anonymous">
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css" integrity="sha384-XdYbMnZ/QjLh6iI4ogqCTaIjrFk87ip+ekIjefZch0Y+PvJ8CDYtEs1ipDmPorQ+" crossorigin="anonymous">
|
||||||
@ -40,7 +40,7 @@
|
|||||||
|
|
||||||
<!-- Branding Image -->
|
<!-- Branding Image -->
|
||||||
<a class="navbar-brand" href="{{ url('/') }}">
|
<a class="navbar-brand" href="{{ url('/') }}">
|
||||||
Laravel
|
Photo
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -5,20 +5,33 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-10 col-md-offset-1">
|
<div class="col-md-10 col-md-offset-1">
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading">Photo <?php echo $photo->id; ?></div>
|
<div class="panel-heading">
|
||||||
|
Photo {{ $photo->id }}<?php if ($photo->remove) : ?> - <strong>PENDING DELETE</strong><?php endif?>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<div class="col-md-2"><img src="/thumbnail/<?php echo $photo->id; ?>" width="200px"></div>
|
<div class="col-md-2">
|
||||||
|
<a href="{{ url('/view/'.$photo->id) }}"><img src="{{ url('/thumbnail/'.$photo->id) }}" width="200px"></a>
|
||||||
|
<div class="text-center">
|
||||||
|
<ul class="pagination">
|
||||||
|
<li <?php if (! $x = $photo->previous()) : ?>class="disabled"<?php endif ?>><a href="{{ $x ? url('/info/'.$x->id) : '#' }}"><<</a></li>
|
||||||
|
<li <?php if (! $x = $photo->next()) : ?>class="disabled"<?php endif ?>><a href="{{ $x ? url('/info/'.$x->id) : '#' }}">>></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
<div class="col-md-10">
|
<div class="col-md-10">
|
||||||
<div class="dl-horizontal">
|
<div class="dl-horizontal">
|
||||||
<dt>Filename</dt><dd><?php echo $photo->file_path(TRUE); ?></dd>
|
<dt>Signature</dt><dd>{{ $photo->signature(TRUE) }}</dd>
|
||||||
|
<dt>Filename</dt><dd>{{ $photo->file_path(TRUE) }}<dd>
|
||||||
<?php if ($photo->shouldMove()) : ?>
|
<?php if ($photo->shouldMove()) : ?>
|
||||||
<dt>NEW Filename</dt><dd><?php echo $photo->file_path(TRUE,TRUE); ?></dd>
|
<dt>NEW Filename</dt><dd>{{ $photo->file_path(TRUE,TRUE) }}<dd>
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
|
<dt>Size</dt><dd>{{ $photo->size() }}<dd>
|
||||||
<br/>
|
<br/>
|
||||||
<dt>Date Taken</dt><dd><?php echo $photo->date_taken(); ?></dd>
|
<dt>Date Taken</dt><dd>{{ $photo->date_taken() }}<dd>
|
||||||
<dt>Camera</dt><dd><?php echo $photo->make; ?></dd>
|
<dt>Camera</dt><dd>{{ $photo->make }}<dd>
|
||||||
<dt>Model</dt><dd><?php echo $photo->model; ?></dd>
|
<dt>Model</dt><dd>{{ $photo->model }}<dd>
|
||||||
<br/>
|
<br/>
|
||||||
<dt>Location</dt><dd>
|
<dt>Location</dt><dd>
|
||||||
<?php if ($photo->gps() == 'UNKNOWN') : ?>
|
<?php if ($photo->gps() == 'UNKNOWN') : ?>
|
||||||
@ -27,7 +40,7 @@
|
|||||||
<div id="map" style="width: 400px; height: 300px"></div>
|
<div id="map" style="width: 400px; height: 300px"></div>
|
||||||
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
|
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var myLatLng = {lat: <?php echo $photo->gps_lat; ?>, lng: <?php echo $photo->gps_lon; ?>};
|
var myLatLng = {lat: {{ $photo->gps_lat }}, lng: {{ $photo->gps_lon }}};
|
||||||
var map = new google.maps.Map(document.getElementById("map"), {
|
var map = new google.maps.Map(document.getElementById("map"), {
|
||||||
zoom: 16,
|
zoom: 16,
|
||||||
center: myLatLng,
|
center: myLatLng,
|
||||||
@ -40,8 +53,27 @@
|
|||||||
</script>
|
</script>
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
</dd>
|
</dd>
|
||||||
|
<br/>
|
||||||
|
<dt>Exif Data</dt><dd>
|
||||||
|
<table>
|
||||||
|
<?php foreach ($photo->io()->getImageProperties() as $k => $v) : ?>
|
||||||
|
<?php if (in_array($k,['signature'])) continue ?>
|
||||||
|
<tr><th>{{ $k }}<><td>{{ $v }}<td></tr>
|
||||||
|
<?php endforeach ?>
|
||||||
|
</table>
|
||||||
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<?php if ($photo->remove) : ?>
|
||||||
|
<form action="{{ url('/undelete/'.$photo->id) }}" method="POST">
|
||||||
|
<button class="btn btn-default">Undelete</button>
|
||||||
|
<?php else : ?>
|
||||||
|
<form action="{{ url('/delete/'.$photo->id) }}" method="POST">
|
||||||
|
<button class="btn btn-default">Delete</button>
|
||||||
|
<?php endif ?>
|
||||||
|
{{ csrf_field() }}
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user