使用Vagrant和Homestead运行Laraval 5.4。
有关此问题的其他几个问题,但没有提供使用Intervention / Image
的canvas()方法的解决方案Laravel介绍了一个easier storage system since 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;
此代码创建一个画布并在其中放置已调整大小的图像。
此代码出现以下错误:
AbstractDecoder.php第335行中的NotReadableException:不是图像源 可在AbstractDecoder.php第335行中读取 AbstractDecoder->初始化('客户端/标识/ UupUn1iuDGRsy5Z0bkWHJ6S4v79bfZiXapTO7vLk.jpeg') 在AbstractDriver.php第64行
第一行有效,因为图像存储在我的存储文件夹中的以下位置:
" /storage/app/public/clients/logo/UupUn1iuDGRsy5Z0bkWHJ6S4v79bfZiXapTO7vLk.jpeg"
但图像以全尺寸存储,因此代码在图像干预部分失败。
我尝试的事情:
我尝试将Image :: make()中的$path
变量更改为:
Storage::disk('public')->url($path)
导致以下错误: 无法将图像数据写入路径
(http://test.dev/storage/clients/logos/owjNA5Fn9QyYoS0i84UgysaFLo5v0NzbOiBhBzXp.jpeg)
关于该错误的奇怪部分是' app'目录在该错误中不可见。
我没有想法来解决这个问题。
在不使用canvas的情况下工作,但仍想知道使用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;
{{Storage::url($client->logo_path)}}
答案 0 :(得分:2)
我的第一个想法是你有一个拼写错误 - 代码包含logo
和logos
路径。
然后我用画布安装了laravel并得到了同样的错误。所以我刚刚进行了一些改进,现在它可以工作了。关键点在于返回的$ path不是存储路径,而是存储/ 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"));
Canvas 需要完整路径或chdir(),可以轻松查看,例如Intervention\Image\Image
源文件(./vendor/intervention/image/src/Intervention/Image/Image.php
)。
save
方法包含简单的$saved = @file_put_contents($path, $data);
,并且没有任何chdir
来电。
答案 1 :(得分:1)
使用您的代码:
$path = $request->file('logo')->store('/clients/logos','public');
返回的$path
相对于您的存储路径。
您需要提供公共存储目录的完全限定路径。
这可以通过使用帮助函数storage_path()来实现,因此您使用storage_path($path)
而不仅仅是$path
因此,您的代码应如下所示:
$path = $request->file('logo')->store('/clients/logos','public');
$canvas = Image::canvas($width, $height);
$image = Image::make(storage_path('app/'.$path))->resize($width, $height, function ($constraint)
{
$constraint->aspectRatio();
});
$canvas->insert($image, 'center');
$canvas->save(storage_path('app/'.$path));
$this->logo_path = 'app/'.$path;
值得一提的是,这尚未经过测试,但我认为这是您的问题。
修改:此外,使用Storage::disk('public')->url($path)
时,它将返回相对于您的公共目录的storage/
路径。因此,正如docs提到的那样:
storage/app/public
目录可用于存储应公开访问的用户生成的文件,例如配置文件头像。您应该在public/storage
处创建指向此目录的符号链接。您可以使用php artisan storage:link
命令创建链接。
当您想要在视图中提供该图像时,可能会帮助您缩小轨道。