90 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
		
		
			
		
	
	
			90 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Oxbow\Http\Controllers;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use Illuminate\Filesystem\Filesystem as File;
							 | 
						||
| 
								 | 
							
								use Illuminate\Http\Request;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use Oxbow\Http\Requests;
							 | 
						||
| 
								 | 
							
								use Oxbow\Image;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class ImageController extends Controller
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    protected $image;
							 | 
						||
| 
								 | 
							
								    protected $file;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * ImageController constructor.
							 | 
						||
| 
								 | 
							
								     * @param Image $image
							 | 
						||
| 
								 | 
							
								     * @param File $file
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function __construct(Image $image, File $file)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $this->image = $image;
							 | 
						||
| 
								 | 
							
								        $this->file = $file;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Returns an image from behind the public-facing application.
							 | 
						||
| 
								 | 
							
								     * @param Request $request
							 | 
						||
| 
								 | 
							
								     * @return \Illuminate\Http\Response
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function getImage(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cacheTime = 60*60*24;
							 | 
						||
| 
								 | 
							
								        $path = storage_path() . '/' . $request->path();
							 | 
						||
| 
								 | 
							
								        $modifiedTime = $this->file->lastModified($path);
							 | 
						||
| 
								 | 
							
								        $eTag = md5($modifiedTime . $path);
							 | 
						||
| 
								 | 
							
								        $headerLastModified = gmdate('r', $modifiedTime);
							 | 
						||
| 
								 | 
							
								        $headerExpires = gmdate('r', $modifiedTime + $cacheTime);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $headers = [
							 | 
						||
| 
								 | 
							
								            'Last-Modified' => $headerLastModified,
							 | 
						||
| 
								 | 
							
								            'Cache-Control' => 'must-revalidate',
							 | 
						||
| 
								 | 
							
								            'Pragma' => 'public',
							 | 
						||
| 
								 | 
							
								            'Expires' => $headerExpires,
							 | 
						||
| 
								 | 
							
								            'Etag' => $eTag
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $browserModifiedSince = $request->header('If-Modified-Since');
							 | 
						||
| 
								 | 
							
								        $browserNoneMatch = $request->header('If-None-Match');
							 | 
						||
| 
								 | 
							
								        if($browserModifiedSince !== null && file_exists($path) && ($browserModifiedSince == $headerLastModified || $browserNoneMatch == $eTag)) {
							 | 
						||
| 
								 | 
							
								            return response()->make('', 304, $headers);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if(file_exists($path)) {
							 | 
						||
| 
								 | 
							
								            return response()->make(file_get_contents($path), 200, array_merge($headers, [
							 | 
						||
| 
								 | 
							
								                'Content-Type' => $this->file->mimeType($path),
							 | 
						||
| 
								 | 
							
								                'Content-Length' => filesize($path),
							 | 
						||
| 
								 | 
							
								            ]));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        abort(404);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Handles image uploads for use on pages.
							 | 
						||
| 
								 | 
							
								     * @param Request $request
							 | 
						||
| 
								 | 
							
								     * @return \Illuminate\Http\JsonResponse
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function upload(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $imageUpload = $request->file('file');
							 | 
						||
| 
								 | 
							
								        $name = $imageUpload->getClientOriginalName();
							 | 
						||
| 
								 | 
							
								        $imagePath = '/images/' . Date('Y-m-M') . '/';
							 | 
						||
| 
								 | 
							
								        $storagePath = storage_path(). $imagePath;
							 | 
						||
| 
								 | 
							
								        $fullPath = $storagePath . $name;
							 | 
						||
| 
								 | 
							
								        while(file_exists($fullPath)) {
							 | 
						||
| 
								 | 
							
								            $name = substr(sha1(rand()), 0, 3) . $name;
							 | 
						||
| 
								 | 
							
								            $fullPath = $storagePath . $name;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $imageUpload->move($storagePath, $name);
							 | 
						||
| 
								 | 
							
								        // Create and save image object
							 | 
						||
| 
								 | 
							
								        $this->image->name = $name;
							 | 
						||
| 
								 | 
							
								        $this->image->url = $imagePath . $name;
							 | 
						||
| 
								 | 
							
								        $this->image->save();
							 | 
						||
| 
								 | 
							
								        return response()->json(['link' => $this->image->url]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |