Wittner
Wittner

Reputation: 593

Trying to resize uploaded files as they are saved to server

I am using Glide to deliver image content from one of my sites. This is working well and I have now built a file upload so that admins can upload images to the site for subsequent download.

Some of the images that admins will upload will be much larger than I need (or want the overhead of storing on the server), so I want to downsize them, preferably during the upload routine or failing that, just after they have been saved to their new location (storage/app/images)

So, I've been hacking around with intervention for instance without much success because of my poor understanding of the file names and paths available from getClientOriginalName/Extension etc.

Could anyone show me a pattern for this which would work well. Ideally I'd love to include something like I've seen on others' examples like...

$img = Image::make('foo.jpg')->resize(300, 200);

... in the correct place in my code

  foreach($files as $file) {
    $fileExtension = $file->getClientOriginalExtension();
    $fileMimeType = $file->getMimeType();
    if(in_array($fileExtension, $allowableExtensions)) {
      if(in_array($fileMimeType, $allowableMimes)) {
        array_push($dbFileList, $file->getClientOriginalName());
        $newImage = '/images/' . $propertyCode . '/' . $file->getClientOriginalName();
        Storage::put('/images/' . $propertyCode . '/' . $file->getClientOriginalName(), file_get_contents($file));
      }else{
        $errorMessage = 'At least one file was not an image, check your results...';
      }
    }else{
      $errorMessage = 'At least one file was not an image, check your results...';
    }
  }

Update 1:

Storage::put('/images/' . $propertyCode . '/' . $file->getClientOriginalName(), file_get_contents($file));
$img = Image::make($file);
Storage::put('/images/new/' . $file->getClientOriginalName(), $img);

This updated code outputs the files to the /new directory and all looks fine, but the output files have 'zero bytes'. What am I missing?

Update 2: Final code

The final answer (after using the proper code provided by contributors) was that:

Then this final code started to work.

$path = storage_path('app/smallpics/')."/".$file->getClientOriginalName();
$img = Image::make($file)->resize(300,200)->save($path);

Much thanks to all of you. You make my Laravel learning curve a bit less terrifiying!!

Upvotes: 1

Views: 818

Answers (3)

Nauman Zafar
Nauman Zafar

Reputation: 1103

You can use Intervention to manipulate your image (resize etc.) as

$new_image = Image::make($file)->resize(300,200)->save('/path/to/save');

Upvotes: 2

Mr.Sun
Mr.Sun

Reputation: 119

you can use Intervention or just use imagemagick convert command line command for resize or convert.

Pay attention to comments :

public function saveUploadPic(Request $request)
  {
    $pic = $request->file('<NAME_OF_FILE_INPUT_IN_HTML_FORM>');

    #check for upload correctly
    if(!$pic->isValid())
    {
      throw new Exception("IMAGE NOT UPLOADED CORRECTLY");
    }

    #check for mime type and extention
    $ext = $pic->getClientOriginalExtension();
    $mime = $pic->getMimeType();
    if(!in_array($mime, $allowedMimeTypeArray) || !in_array($ext, $allowedExtArray))
    {
      throw new Exception("This Image Not Support");
    }
    #check for size
    $size = $pic->getClientSize() / 1024 / 1024;
    if($size > $allowedSize)
    {
      throw new Exception("Size Of Image Is More Than Support Size");
    }

    ########################YOU HAVE TWO OPTION HERE###################
    #1- save image in a temporary location with random hash for name if u need orginal image for other process
          #below code save image in <LARAVEL_APP_PATH>/storage/app/tmp/pics/
          $hash = md5(date("YmdHis").rand(1,10000));
          $pic->storeAs('tmp/pics', $hash.'.'.$ext);

          #Then resize or convert it
          $img = Image::make(storage_path('app/tmp/pics/'.$hash.'.'.$ext))->resize(300, 200);
          #save new image whatever u want 
          $img->save('<PATH_TO_SAVE_IMAGE>');
          #after u finish with orginal image delete it
          Storage::delete(storage_path('app/tmp/pics/'.$hash.'.'.$ext);

    #2- Or just use below for resize and save image witout need to save in temporary location
          $img = Image::make($pic->getRealPath())->resize(300,200);
          $img->save('<PATH_TO_SAVE_IMAGE>');
  }

if you want to use convert see this link.

Upvotes: 0

Mayank Pandeyz
Mayank Pandeyz

Reputation: 26278

The image upload and resize work flow is like:

  • Upload the image from tmp to your directory.
  • Make a copy of that image by setting the height, width, quality and save it in the same or some other directory.
  • Delete the original image.

So as per your code flow:

Storage::put('/images/' . $propertyCode . '/' . $file->getClientOriginalName(), file_get_contents($file));

after this code, put the image compress code and after that delete the original image.

Upvotes: 0

Related Questions