Image Intervention w/ Laravel 5.4 Storage

后端 未结 10 840
执笔经年
执笔经年 2021-02-05 03:16

I\'m using the storage facade to store a avatar which works fine, but I want to resize my image like I did in previous versions of laravel. How can I go about doing this? Here i

相关标签:
10条回答
  • 2021-02-05 03:50

    Make sure to add use Illuminate\Http\File; to top of your file for this to work, and read through the documentation section Automatic Streaming.

    This assumes you want all jpegs

    $path   = $request->file('createcommunityavatar');
    $resize = Image::make($path)->fit(300)->encode('jpg');
    $filePath = $resize->getRealPath() . '.jpg';
    $resize->save($filePath);
    $store  = Storage::putFile('public/image', new File($resize));
    $url    = Storage::url($store);
    

    This is how I am doing it in my application with comments to help

    // Get the file from the request
    $requestImage = request()->file('image');
    
    // Get the filepath of the request file (.tmp) and append .jpg
    $requestImagePath = $requestImage->getRealPath() . '.jpg';
    
    // Modify the image using intervention
    $interventionImage = Image::make($requestImage)->resize(125, 125)->encode('jpg');
    
    // Save the intervention image over the request image
    $interventionImage->save($requestImagePath);
    
    // Send the image to file storage
    $url = Storage::putFileAs('photos', new File($requestImagePath), 'thumbnail.jpg');
    
    return response()->json(['url' => $url]);
    
    0 讨论(0)
  • 2021-02-05 03:51

    Using Laravel 5.8

    I had a similar issue when trying to read an image file with Image when this one was saved and loaded with Storage.
    Beside all the answers I wasn't sure why it wasn't working.


    Exception when Image was trying to read the file

    Intervention\Image\Exception\NotReadableException : Unable to init from given binary data.

    Short answer

    Adding ->encode()solved the issue

    http://image.intervention.io/api/encode

    Scenario

    Basically I had a test like this

    Storage::fake();
    
    $photo = factory(Photo::class)->create();    
    $file = \Image::make(
        UploadedFile::fake()->image($photo->file_name, 300, 300)
    );
    
    Storage::disk($photo->disk)
        ->put(
            $photo->fullPath(),
            $file
        );
    

    And in the controller I had something like this

    return \Image::make(
        Storage::disk($photo->disk)
            ->get(
                $photo->fullPath()
            )
    )->response();
    

    Solution

    After investigation I realized that any file created by Image and saved by the Storage had a size of 0 octets. After looking at all the solutions from this post and few hours after, I noticed everyone was using encode() but no one did mention it was that. So I tried and it worked.

    Investigating a bit more, Image does, in fact, encode under the hood before saving. https://github.com/Intervention/image/blob/master/src/Intervention/Image/Image.php#L146

    So, my solution was to simple doing this

    $file = \Image::make(
        \Illuminate\Http\UploadedFile::fake()->image('filename.jpg', 300, 300)
    )->encode();
    
    \Storage::put('photos/test.jpg', $file);
    

    testable in Tinker, It will create a black image

    0 讨论(0)
  • 2021-02-05 03:53

    The put method works with the Image intervention output. The putFile method accepts either an Illuminate\Http\File or Illuminate\Http\UploadedFile instance.

    $photo = Image::make($request->file('photo'))
      ->resize(400, null, function ($constraint) { $constraint->aspectRatio(); } )
      ->encode('jpg',80);
    
    Storage::disk('public')->put( 'photo.jpg', $photo);
    

    The above code resizes the uploaded file to 400px width while holding the aspect ratio. Then encodes to jpg at 80% quality. The file is then stored to the public disc. Note you must provide a filename, not just the directory.

    0 讨论(0)
  • 2021-02-05 04:00

    You can't store an \Intervention\Image\Image object directly with the Laravel 5 filesystem. What you can do is resize the image from your request, and save it under the same tmp path. Then just store the uploaded (overwritten) file to the filesystem.

    Code:

    $image  = $request->file('createcommunityavatar');
    //resize and save under same tmp path
    $resize = Image::make($image)->fit(300)->save();
    // store in the filesystem with a generated filename
    $store  = $image->store('image', 'public');
    // get url from storage
    $url    = Storage::url($store);
    
    0 讨论(0)
提交回复
热议问题