Reputation: 511
My problem is how to create suitable path for when i need to safe an image. I tried tutorial and previous SO intervention answered questions, but couldn't apply suggested solutions. I'm using image intervention in Laravel.
My current path is:
$filenameWithExtThumb = $request->file("thumbnail")->getClientOriginalName();
$filenameThumb = pathinfo($filenameWithExtThumb, PATHINFO_FILENAME);
$extensionThumb = $request->file("thumbnail")->getClientOriginalExtension();
$fileNameToStoreThumb = $filenameThumb."_".time().".".$extensionThumb;
$image_resize = Image::make($request->file("thumbnail")->getRealPath());
$image_resize->resize(320, 240);
$pathThumb = $request->file("thumbnail")->storeAs("public/".auth()->user()->name."'s Thumbnails", $fileNameToStoreThumb);
which works fine if i just store it unresized. If i use
$pathThumb = $image_resize->storeAs("public/".auth()->user()->name."'s Thumbnails", $fileNameToStoreThumb);
it doesn't work. I also tried:
$image_resize->save("/public/storage/".auth()->user()->name."'s Thumbnails");
which also doesn't work. and
$pathThumb = $image_resize->save("/public/storage/".auth()->user()->name."'s Thumbnails");
I would liked to use this:
$pathThumb = $request->file("thumbnail")->storeAs("public/".auth()->user()->name."'s Thumbnails", $fileNameToStoreThumb);
with $image_resize
. Is it possible and how?
My path is:
"public/storage".auth()->user()->name."'s Thumbnails", $fileNameToStoreThumb
Example: public/storage/ -> Johnny's Thumbnails -> nameOfTheFile.jpg
Edit1:
Resolved by doing path like this:
$pathThumb = $image_resize->save(public_path("storage/".auth()->user()->name."'s Thumbnails/".$fileNameToStoreThumb));
Now i want to delete previous thumbnail, except if it isn't "nothumbnail.jpg".
if ($request->hasFile('thumbnail')) {
if($video->thumbnail==="../nothumbnail.jpg"){
$video->thumbnail = $fileNameToStoreThumb;
}
if($video->thumbnail!=="../nothumbnail.jpg"){
Storage::delete("public/storage/".auth()->user()->name."'s Thumbnails/".$video->thumbnail);
$video->thumbnail = $fileNameToStoreThumb;
}
}
else{
if($video->thumbnail==="../nothumbnail.jpg"){
$video->thumbnail = "../nothumbnail.jpg";
}
if($video->thumbnail!=="../nothumbnail.jpg"){
Storage::delete("public/storage/".auth()->user()->name."'s Thumbnails/".$video->thumbnail);
$video->thumbnail = "../nothumbnail.jpg";
}
}
And again it's a path issue :(
Edit2: The Solution to edit1: After many hours i didn't found mistake since i so much modified my original code so i couldn't find it for the life of me. So i accidentally devised solution of quite accidental nature:
$filenameWithExtThumb = null;
$filenameThumb = null;
$extensionThumb = null;
$fileNameToStoreThumb = null;
$image_resize = null;
$pathThumb = null;
if($request->hasFile("thumbnail")){
$filenameWithExtThumb = $request->file("thumbnail")->getClientOriginalName();
$filenameThumb = pathinfo($filenameWithExtThumb, PATHINFO_FILENAME);
$extensionThumb = $request->file("thumbnail")->getClientOriginalExtension();
$fileNameToStoreThumb = $filenameThumb."_".time().".".$extensionThumb;
$image_resize = Image::make($request->file("thumbnail")->getRealPath());
$image_resize->resize(320, 240);
$pathThumb = $image_resize->save(public_path("storage/".auth()->user()->name."'s Thumbnails/".$fileNameToStoreThumb));
if($video->thumbnail!=="../nothumbnail.jpg"){
unlink(public_path("storage/".auth()->user()->name."'s Thumbnails/".$video->thumbnail));
$video->thumbnail = $fileNameToStoreThumb;
}
if($video->thumbnail==="../nothumbnail.jpg"){
$video->thumbnail = $fileNameToStoreThumb;
}
}
else{
if($video->thumbnail!=="../nothumbnail.jpg"){
unlink(public_path("storage/".auth()->user()->name."'s Thumbnails/".$video->thumbnail));
$video->thumbnail = "../nothumbnail.jpg";
}
if($video->thumbnail==="../nothumbnail.jpg"){
$video->thumbnail = "../nothumbnail.jpg";
}
}
Didn't use Storage facade though, but vanilla php unlink for file deletion. Is it ok to not use Laravel's inbuilt capabilities instead vanilla's?
Upvotes: 1
Views: 750
Reputation: 680
I think there is some kind of mess with path to storage. Try this code and make sure you have done with php artisan storage:link
Docs
if ($request->hasFile('thumbnail') && $request->file('thumbnail')->isValid()) {
$extension = $request->file("thumbnail")->getClientOriginalExtension();
$image_resize = Image::make($request->file('thumbnail'));
$image_resize->resize(320, 240);
$hash = md5($image_resize->__toString());
$filename = $hash . "." . $extension;
$image_resize->save(storage_path("app/public/" . auth()->user()->name . "'s Thumbnails/" . $filename));
}
This should save file to storage/app/public/User's Thumbnails/filename.ext linked from /public/storage/User's Thumbnails/filename.ext
Upvotes: 0