Search code examples
laravelimage-resizingintervention

Laravel 5.4 Error: NotReadableException: Image source not readable


I'm trying to create multiple copies of profile pic in different sizes when a profile is created. But I am constantly getting this error:

" NotReadableException: Image source not readable"

Can somebody point me what I'm missing in my below code:

public function updateprofile(UserProfileRequest $request){
    $user_id = Auth::User()->id;
    $profile = UserProfile::where('user_id','=',$user_id)->first();
    $profile->fullname = $request->fullname;

    if ($request->hasFile('img')) {
        if($request->file('img')->isValid()) {
            $types = array('_original.', '_32.', '_64.', '_128.');
            $sizes = array( '32', '64', '128');
            $targetPath = 'public/uploads/'.$user_id;

            try {
                $file = $request->file('img');
                $ext = $file->getClientOriginalExtension();
                $fName = time();
                $original = $fName . array_shift($types) . $ext;
                Storage::putFileAs($targetPath, $file, $original);

                foreach ($types as $key => $type) {
                    $newName = $fName . $type . $ext;
                    Storage::copy($targetPath . $original, $targetPath . $newName);
                    $newImg = Image::make($targetPath . $newName);
                    $newImg->resize($sizes[$key], null, function($constraint){
                        $constraint->aspectRatio();
                    });
                    $newImg->save($targetPath . $newName);
                }

                $profile->img = 'public/uploads/'.$user_id;
            } catch (Illuminate\Filesystem\FileNotFoundException $e) {
            }
        }
    }

    $profile->save();}

Solution

  • Finally, I got it working. I made following changes to my code:

    1. Use the full OS path as suggested by commanderZiltoid for the destination path.
    2. Don't use Storage::putFileAs method to save the file. So, remove this line: Storage::putFileAs($targetPath, $file, $original);
    3. Don't use Storage::copy() to copy the file, so, remove this line: Storage::copy($targetPath . $original, $targetPath . $newName);
    4. For points 2 and 3, use Image::make($file->getRealPath()); This will create the file and remember the path where the file was created. Image->resize method will use this path later.
    5. In the end, save the relative path in the database, as here: $profile->img = 'storage/uploads/'.$user_id.'/img/profile/'.$fName. Since we'll use {{ asset($profile->img) }}, it's necessary to save only the relative path and not the absolute OS path.

      if($request->hasFile('img')) {
      
          if($request->file('img')->isValid()) {
      
              $types = array('_original.', '_32.', '_64.', '_128.'); 
      
              $sizes = array( array('32','32'), array('64','64'), array('128','128'));
              $targetPath = '/Users/apple/Documents/_chayyo/chayyo/storage/app/public/uploads/'.$user_id.'/img/profile/';
      
          try {
              $file = $request->file('img');
              $ext = $file->getClientOriginalExtension();
              $fName = time();
              $o_name = $fName . array_shift($types) . $ext;
              $original = Image::make($file->getRealPath());
              $original->save($targetPath . $o_name);
      
              foreach ($types as $key => $type) {
                  $newName = $fName . $type . $ext;
                  $newImg = Image::make($file->getRealPath());
                  $newImg->resize($sizes[$key][0], $sizes[$key][1]);
                  $newImg->save($targetPath . $newName);
              }
      
              $profile->img = 'storage/uploads/'.$user_id.'/img/profile/'.$fName;
      
          } 
           catch (Illuminate\Filesystem\FileNotFoundException $e) {
      
          }
        }
      }