将 Laravel 存储与图像干预画布()一起使用

Chr*_*hvh 3 php laravel intervention laravel-5.4

使用 Vagrant 和 Homestead 运行 Laraval 5.4。

看到了有关此问题的其他一些问题,但没有一个提供使用Intervention/Image的canvas()方法的解决方案

Laravel从 5.3开始引入了一个更简单的存储系统

我目前的代码:

$path = $request->file('logo')->store('/clients/logos','public');

$canvas = Image::canvas($width, $height);
$image = Image::make($path)->resize($width, $height, function ($constraint)
{
    $constraint->aspectRatio();
});

$canvas->insert($image, 'center');
$canvas->save($path);

$this->logo_path = $path;
Run Code Online (Sandbox Code Playgroud)

此代码创建一个画布并在其中放置一个调整大小的图像。

此代码给出以下错误:

在 AbstractDecoder.php 第 335 行中的 NotReadableException:在 AbstractDecoder->init('clients/logos/UupUn1iuDGRsy5Z0bkWHJ6S4v79bfZiXapTO7vLk.jpeg') 在 AbstractDriver.php 行中,AbstractDecoder.php 第 335 行中的图像源不可读

第一行有效,因为图像存储在我的存储文件夹中的以下位置:

“/storage/app/public/clients/logo/UupUn1iuDGRsy5Z0bkWHJ6S4v79bfZiXapTO7vLk.jpeg”

但是图像以全尺寸存储,因此代码在图像干预部分失败。

我尝试过的事情:我尝试将$pathImage::make() 中的变量更改为:

Storage::disk('public')->url($path)
Run Code Online (Sandbox Code Playgroud)

这导致以下错误:无法将图像数据写入路径

( http://test.dev/storage/clients/logos/owjNA5Fn9QyYoS0i84UgysaFLo5v0NzbOiBhBzXp.jpeg )

关于该错误的奇怪部分是“app”目录在该错误中不可见。

我已经没有想法来解决这个问题了。

编辑

在不使用画布的情况下工作,但仍然想知道使用 canvas() 的方法

这就是我目前让它工作的方式:

$path = $logo->hashName('public/clients/logos');

$image = Image::make($logo);

$image->resize($width, $height, function ($constraint)
{
    $constraint->aspectRatio();
});

Storage::put($path, (string) $image->encode(), 'public');

$this->logo_path = $path;
Run Code Online (Sandbox Code Playgroud)

检索图像

{{Storage::url($client->logo_path)}}
Run Code Online (Sandbox Code Playgroud)

shu*_*van 5

我的第一个想法是你有一个错字 - 代码包含logologos路径。

然后我用画布安装了 laravel 并得到了同样的错误。所以我刚刚做了一些路径改进,现在它可以工作了。关键是返回的 $path 不是相对于您的存储路径,而是相对于 storage/app/public

$width = 50;
$height = 50;

// here $path is set to "clients/logos/FWGXEf9AJ0NOspFoxelTtGUqmr0YP4ztUMUcqkXc.png"
$path = $request->file('logo')->store('/clients/logos','public');

// creating a canvas
$canvas = Image::canvas($width, $height);

// pass the right full path to the file. Remember that $path is a path inside app/public !
$image = Image::make(storage_path("app/public/" . $path))->resize($width, $height, 
    function ($constraint) {
        $constraint->aspectRatio();
});

$canvas->insert($image, 'center');

// pass the full path. Canvas overwrites initial image with a logo
$canvas->save(storage_path("app/public/" . $path . ".png"));
Run Code Online (Sandbox Code Playgroud)

Canvas需要完整路径或 chdir() 到它,它可以很容易地签入例如Intervention\Image\Image源文件 ( ./vendor/intervention/image/src/Intervention/Image/Image.php)。

save方法包含简单$saved = @file_put_contents($path, $data);且没有任何chdir调用。