8

I am in the process of upgrading a project from Laravel 5 to 5.1. One package that needed to be updated was League\Flysystem.

I am using Intervention\Image to resize an image and then Flysystem to save it to S3. The code below was working with 5.0 -

// Album ID
$id = $request->input('id');
// Filename for this photo
$filename = str_random() . ".jpg";

// Get the storage disk
$disk = Storage::disk('s3');

// Resize the photo
$image = Image::make($request->file('photo'));
$image->orientate();
$image->resize(1024, 748, function ($constraint) {
            $constraint->aspectRatio();
});
$image->encode('jpg');
// Save the photo to the disk
$disk->put("img/album/$id/$filename", $image);

But now I am receiving the following error: fstat() expects parameter 1 to be resource, object given, thrown in league\flysystem\src\Util.php, line 250.

I am using "intervention/image": "~2.1", "league/flysystem-aws-s3-v3" : "~1.0",

Any ideas what might be causing this?

Laurence
  • 58,936
  • 21
  • 171
  • 212
NightMICU
  • 9,000
  • 30
  • 89
  • 121

3 Answers3

17

The better way to do this is to type cast the encoded output:

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

$image->encode('jpg');
$disk->put("img/album/$id/$filename", (string) $image);
Citizen
  • 12,430
  • 26
  • 76
  • 117
11

You might have been lucky before some type casting on your $image object made a string out of it, I guess a simple change of your last line to

$disk->put("img/album/$id/$filename", $image->__toString());

will fix the problem and is safer anyway as the put method officially only accepts strings (and looking at the implementation of php resources as wekk).
That should keep you compatible to changes in the long run.

Salim Djerbouh
  • 10,719
  • 6
  • 29
  • 61
ChristianM
  • 1,793
  • 12
  • 23
  • Now receive Command `(_toString) is not available for driver (Gd)`. – NightMICU Jun 09 '15 at 17:39
  • is that a writing error (_toString) or did you have only one underscore? It should be __toString() with two underscores. – ChristianM Jun 09 '15 at 17:43
  • 1
    Sure, so first of all `put` accepts either a string or a php resource. I guess that it worked before was because somewhere inside the flysystem code a string function or an explicit string cast happened on the input argument (so something in the lines of `(string) $image` which would do the same as doing $image->__toString()). That is a magic method that is used to convert the given object into a string whenever necessary and intervention Image implements it. _toString is not implemented and throws the error because intervention tries to execute that as Image (manipulation) command. – ChristianM Jun 09 '15 at 17:47
  • Got it, thanks! Was expecting this to be much harder to solve. Really appreciate the help. :) – NightMICU Jun 09 '15 at 17:49
  • 1
    Great I could be of help. :) Sometimes if you expect something to be hard to solve you don't see the easy solution, have the same problem sometimes :) – ChristianM Jun 09 '15 at 17:50
0

i got version "intervention/image": "^2.4",

The __toString() didn't work for me, the file was created corrupted... i did ->stream()->getContents().

Tomer Ofer
  • 378
  • 3
  • 15