Veljko Stefanovic
Veljko Stefanovic

Reputation: 511

Image intervention save path

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

Answers (1)

Constantine
Constantine

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

Related Questions