Skip to content

Instantly share code, notes, and snippets.

@awgv
Created November 13, 2018 20:06
Show Gist options
  • Save awgv/f299b44b3fc4d2e7a3239c600bcdf270 to your computer and use it in GitHub Desktop.
Save awgv/f299b44b3fc4d2e7a3239c600bcdf270 to your computer and use it in GitHub Desktop.
An example of a controller that gets files from the storage folder.
<?php
// Use statements.
class FileController extends Controller
{
public function show(ShowFileRequest $request, $slug)
{
$media = Media::where('slug', $slug)->first();
$handler = new \Symfony\Component\HttpFoundation\File\File($media->getPath());
$lifetime = 31556926;
// Preparing headers.
$file_time = $handler->getMTime(); // Get the last modified time for the file (Unix timestamp).
$header_content_type = $handler->getMimeType();
$header_content_length = $handler->getSize();
$header_etag = md5($file_time . $media->getPath());
$header_last_modified = gmdate('r', $file_time);
$header_expires = gmdate('r', $file_time + $lifetime);
$headers = [
'Content-Disposition' => 'attachment; filename="' . $media->file_name . '"',
'Last-Modified' => $header_last_modified,
'Cache-Control' => 'must-revalidate',
'Expires' => $header_expires,
'Pragma' => 'public',
'Etag' => $header_etag
];
// If the file is an image or a pdf.
if ($header_content_length > 0)
{
if ( is_array(getimagesize($media->getPath())) )
{
$headers['Content-Disposition'] = 'inline; filename="' . $media->file_name . '"';
}
elseif ($header_content_type === 'application/pdf')
{
$headers['Content-Disposition'] = 'inline; filename="' . $media->file_name . '"';
$headers['Accept-Ranges'] = 'bytes';
}
}
// Resource cache:
$h1 = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $_SERVER['HTTP_IF_MODIFIED_SINCE'] == $header_last_modified;
$h2 = isset($_SERVER['HTTP_IF_NONE_MATCH']) && str_replace('"', '', stripslashes($_SERVER['HTTP_IF_NONE_MATCH'])) == $header_etag;
if ($h1 || $h2) {
return Response::make('', 304, $headers);
}
$headers = array_merge($headers, [
'Content-Type' => $header_content_type,
'Content-Length' => $header_content_length
]);
return Response::make(file_get_contents($media->getPath()), 200, $headers);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment