使用Laravel Intervention图像上传到S3会返回布尔值而不是路径

时间:2019-06-27 06:13:06

标签: php laravel amazon-s3 intervention

在Laravel中上传图片时遇到问题。有时,图像需要重新定向-使用Intervention图像进行此操作时,它仅返回布尔值而不是s3中图像的路径。在没有干预图像的情况下使用它时效果很好

我尝试exif读取数据并使用imagerotate无济于事,它出错了

我运行以下

$image = $request->file('photo');
$path = \Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image, 'public');
dd($path); // /users/1/posts/39grjigrje.jpg

$path变量很好,它是s3路径,但是正在运行:

$image = $request->file('photo');
$image = \Image::make($image);
$image->orientate();
$path = \Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image, 'public');
dd($path); // true

$path变量只是一个布尔值,不返回存储的文件路径

我希望有一条路径,例如/images/1/kfjeieuge.jpg,当我不使用干预图像时得到,当我使用干预时得到布尔值。

4 个答案:

答案 0 :(得分:2)

几年前,我也面临过同样的问题。我通过以下步骤解决了这个问题:

1。您可能需要在对图像进行干预后对其进行编码。 要实现编码,请参考以下有关流方法的文档:Create encoded image stream

  

以给定的格式和给定的图像质量对当前图像进行编码,并基于图像数据创建新的PSR-7流。

$image = Image::make(request()->file('image'))->orientate()->encode('jpg');

2。然后将其与流一起存储

$path = Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image->stream(),'public');

这应该可以实现您的目标。

答案 1 :(得分:1)

在第一个示例中:

$image = $request->file('photo');
$path = \Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image, 
'public');

$ request-> file('photo')文件将返回Illuminate \ Http \ UploadedFile类的实例。您可以在link文档中进行检查。

正如塔伦(Tarun)所说,“ put”方法检查Illuminate \ Http \ UploadedFile类的实例。因此,在这种情况下,它将成功上传。

在第二个示例中:

$image = $request->file('photo');
$image = \Image::make($image); //here
$image->orientate();
$path = \Storage::disk('s3')->put('users/' . \Auth::id() . '/posts', $image, 'public');

您正在用实例“ Image”类(第二行)覆盖“ $ image”变量。哪有错您需要传递流或文件。

尝试以下代码:

$image = $request->file('photo');
$image = \Image::make($image); //here
$image->orientate()->encode('jpg');
$filename = time() . '.jpg';
$path = \Storage::disk('s3')->put('users/' . \Auth::id() . '/posts/'.$filename, $image->getEncoded(), 'public');

答案 2 :(得分:0)

您可以按照以下链接中的说明进行解决

https://laracasts.com/discuss/channels/laravel/saving-an-intervention-image-instance-into-amazon-s3

$path = \Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image->stream()->__toString(), 'public');

更新:7月5日

如果您查看源代码,应该只返回bool

https://github.com/laravel/framework/blob/c7bdf66062af3c63648f7c29591476e6db92c885/src/Illuminate/Filesystem/FilesystemAdapter.php#L192

/**
     * Write the contents of a file.
     *
     * @param  string  $path
     * @param  string|resource  $contents
     * @param  mixed  $options
     * @return bool
     */
    public function put($path, $contents, $options = [])
    {
        $options = is_string($options)
                     ? ['visibility' => $options]
                     : (array) $options;
        // If the given contents is actually a file or uploaded file instance than we will
        // automatically store the file using a stream. This provides a convenient path
        // for the developer to store streams without managing them manually in code.
        if ($contents instanceof File ||
            $contents instanceof UploadedFile) {
            return $this->putFile($path, $contents, $options);
        }
        return is_resource($contents)
                ? $this->driver->putStream($path, $contents, $options)
                : $this->driver->put($path, $contents, $options);
    }

正如您所看到的,Streamfile的处理方式不同

理想的情况是使用url函数来获取网址

Storage::disk('s3')->url($filename)

答案 3 :(得分:0)

尝试一下

$image = \Image::make($request->file('photo')->getRealpath());
$image->orientate();


$image->encode('jpg');
 OR
$image->response('jpg', 100);


$path = \Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image, 'public');