Currently when I upload an image on my website, I create 3 alternative images with different dimensions in my uploadImage();
function. I've been wondering if it is possible to create the images on demand only.
For example, only create 500px width version only when a user visits the route that actually requires this image. This way I wouldn't have to save all 4 images during the upload ( which I assume slows it down ) and I wouldn't have to save an image which might never be requested.
public function uploadImage(Request $request){
$this->validate($request, [
'name' => 'required|max:120',
'description' => 'max:120|nullable',
'image' => 'required'
]);
$name = $request['name'];
$description = $request['description'];
$tag = $request['tags'];
$userId = auth()->user()->id;
$file = $request->file('image')->getClientOriginalName();
$fileName = pathinfo($file, PATHINFO_FILENAME);
$extension = $request->file('image')->getClientOriginalExtension();
$fileNameToStore = $fileName.'_'.time().'.'.$extension;
$fileNameToStore = str_replace(' ', '', $fileNameToStore);
$request->file('image')->storeAs('public/uploads/images/',$fileNameToStore);
$request->file('image')->storeAs('public/uploads/images/thumbnails/',$fileNameToStore);
$request->file('image')->storeAs('public/uploads/images/specificImages/',$fileNameToStore);
$request->file('image')->storeAs('public/uploads/images/miniImages/',$fileNameToStore);
$thumbnail = InterventionImage::make('storage/uploads/images/thumbnails/'.$fileNameToStore )->resize(500, null, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
});
$thumbnail->save();
$specificImage = InterventionImage::make('storage/uploads/images/specificImages/'.$fileNameToStore )->resize(1240, null, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
});
$specificImage->save();
$miniImage = InterventionImage::make('storage/uploads/images/miniImages/'.$fileNameToStore )->fit(200, 200, function ($constraint) {
$constraint->upsize();
});
$miniImage->save();
$image = new Image();
$image->name = $name;
$image->description = $description;
$image->user_id = $userId;
$image->file_name = $fileNameToStore;
$image->save();
$image->tags()->attach($tag);
return redirect()->route('home');
}
My View that displays 500px image:
@extends('layouts.app')
@section('content')
<div class="specificStickyContainer">
<h1 class='specificImageTitle'>{{$image->name}} by <a href='{{url("profile/".$author->username )}}'>{{$author->username}}</a></h1>
<img class='specific-image' src='{{url("storage/uploads/images/specificImages/".$image->file_name)}}' alt='Random image' />
@if(Auth::user())
@if(Auth::id() === $image->user_id || Auth::user()->hasRole('Admin'))
<div class='deleteButton'></div>
<a class='deleteA' href='{{ route('deleteImage', ['image_id' => $image->id]) }}'>X</a>
@endif
@endif
</div>
@endsection