authorizeForUser($this->getUser(), 'view', $album); if (UserConfig::get('hotlink_protection')) { $referrer = $request->headers->get('Referer'); if (!is_null($referrer)) { $hostname = parse_url($referrer, PHP_URL_HOST); if (strtolower($hostname) != strtolower($request->getHttpHost())) { App::abort(403); return null; } } else { App::abort(403); return null; } } $photo = PhotoController::loadPhotoByAlbumAndFilename($album, $photoFilename); $thumbnail = $request->get('t'); if (is_null($thumbnail)) { $this->authorizeForUser($this->getUser(), 'photo.download_original', $photo); } // Record the visit to the photo if (UserConfig::get('enable_visitor_hits')) { DB::transaction(function () use ($album, $photo, $request, $thumbnail) { $photo->hits_download++; $photo->save(); VisitorHit::fromRequest($request, $album->id, $photo->id, (is_null($thumbnail) ? 'original' : $thumbnail)); }); } $photoStream = $album->getAlbumSource()->fetchPhotoContent($photo, $thumbnail); $mimeType = Mimetypes::getInstance()->fromFilename($photo->storage_file_name); return response()->stream( function() use ($photoStream) { echo $photoStream; }, 200, [ 'Content-Length' => $photoStream->getContentLength(), 'Content-Type' => $mimeType ] ); } public function show(Request $request, $albumUrlAlias, $photoFilename) { $album = DbHelper::getAlbumByPath($albumUrlAlias); if (is_null($album)) { App::abort(404); return null; } $this->authorizeForUser($this->getUser(), 'view', $album); $photo = PhotoController::loadPhotoByAlbumAndFilename($album, $photoFilename); $isOriginalAllowed = Gate::forUser($this->getUser())->allows('photo.download_original', $photo); // Load the Next/Previous buttons $thisPhotoDate = is_null($photo->taken_at) ? $photo->created_at : $photo->taken_at; $previousPhoto = $album->photos() ->where(DB::raw('COALESCE(taken_at, created_at)'), '<', $thisPhotoDate) ->orderBy(DB::raw('COALESCE(taken_at, created_at)'), 'desc') ->first(); $nextPhoto = $album->photos() ->where(DB::raw('COALESCE(taken_at, created_at)'), '>', $thisPhotoDate) ->orderBy(DB::raw('COALESCE(taken_at, created_at)')) ->first(); // Record the visit to the photo if (UserConfig::get('enable_visitor_hits')) { DB::transaction(function () use ($album, $photo, $request) { $photo->hits++; $photo->save(); VisitorHit::fromRequest($request, $album->id, $photo->id); }); } return Theme::render('gallery.photo', [ 'album' => $album, 'is_original_allowed' => $isOriginalAllowed, 'next_photo' => $nextPhoto, 'photo' => $photo, 'previous_photo' => $previousPhoto ]); } public function showExifData(Request $request, $albumUrlAlias, $photoFilename) { $album = DbHelper::getAlbumByPath($albumUrlAlias); if (is_null($album)) { App::abort(404); return null; } $this->authorizeForUser($this->getUser(), 'view', $album); $photo = PhotoController::loadPhotoByAlbumAndFilename($album, $photoFilename); $this->authorizeForUser($this->getUser(), 'changeMetadata', $photo); return Theme::render('gallery.photo_exif', [ 'album' => $album, 'exif_data' => print_r(unserialize($photo->raw_exif_data), true), 'photo' => $photo ]); } /** * @param $id * @return Photo */ public static function loadPhotoByAlbumAndFilename(Album $album, $filename) { $photo = Photo::where([ ['album_id', $album->id], ['storage_file_name', $filename] ])->first(); if (is_null($photo)) { App::abort(404); return null; } return $photo; } }