使用 laravel 存储和图像干预 canvas()
Use laravel storage with Image intervention canvas()
运行 Laraval 5.4 与 Vagrant 和 Homestead。
看到了一些关于此问题的其他问题,但 none 提供了一个解决方案,该解决方案使用 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;
此代码创建一个 canvas 并在其中放置一个调整大小的图像。
此代码给出以下错误:
NotReadableException in AbstractDecoder.php line 335: Image source not
readable in AbstractDecoder.php line 335 at
AbstractDecoder->init('clients/logos/UupUn1iuDGRsy5Z0bkWHJ6S4v79bfZiXapTO7vLk.jpeg')
in AbstractDriver.php line 64
第一行有效,因为图像存储在我的存储文件夹中的以下位置:
"/storage/app/public/clients/logo/UupUn1iuDGRsy5Z0bkWHJ6S4v79bfZiXapTO7vLk.jpeg"=21=]
但是图像是以全尺寸存储的,所以代码在图像干预部分失败了。
我尝试过的事情:
我尝试将 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)}}
使用您的代码:
$path = $request->file('logo')->store('/clients/logos','public');
returned $path
是相对于你的存储路径。
您需要提供 public 存储目录的完全限定路径。
这可以通过使用辅助函数 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)
时,它将 return 相对于您的 public 的 storage/
路径] 目录。因此,正如 docs 提到的:
The storage/app/public
directory may be used to store user-generated files, such as profile avatars, that should be publicly accessible. You should create a symbolic link at public/storage
which points to this directory. You may create the link using the php artisan storage:link
command.
当您想在您的视图中提供该图像时,可能会帮助您走下正轨。
我的第一个想法是你打错了 - 代码同时包含 logo
和 logos
路径。
然后我用 canvas 安装了 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"));
Canvas 需要完整路径或 chdir() 到它,它可以很容易地检查,例如Intervention\Image\Image
源文件(./vendor/intervention/image/src/Intervention/Image/Image.php
)。
save
方法包含简单的 $saved = @file_put_contents($path, $data);
并且没有任何 chdir
调用。
运行 Laraval 5.4 与 Vagrant 和 Homestead。
看到了一些关于此问题的其他问题,但 none 提供了一个解决方案,该解决方案使用 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;
此代码创建一个 canvas 并在其中放置一个调整大小的图像。
此代码给出以下错误:
NotReadableException in AbstractDecoder.php line 335: Image source not readable in AbstractDecoder.php line 335 at AbstractDecoder->init('clients/logos/UupUn1iuDGRsy5Z0bkWHJ6S4v79bfZiXapTO7vLk.jpeg') in AbstractDriver.php line 64
第一行有效,因为图像存储在我的存储文件夹中的以下位置:
"/storage/app/public/clients/logo/UupUn1iuDGRsy5Z0bkWHJ6S4v79bfZiXapTO7vLk.jpeg"=21=]
但是图像是以全尺寸存储的,所以代码在图像干预部分失败了。
我尝试过的事情:
我尝试将 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)}}
使用您的代码:
$path = $request->file('logo')->store('/clients/logos','public');
returned $path
是相对于你的存储路径。
您需要提供 public 存储目录的完全限定路径。
这可以通过使用辅助函数 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)
时,它将 return 相对于您的 public 的 storage/
路径] 目录。因此,正如 docs 提到的:
The
storage/app/public
directory may be used to store user-generated files, such as profile avatars, that should be publicly accessible. You should create a symbolic link atpublic/storage
which points to this directory. You may create the link using thephp artisan storage:link
command.
当您想在您的视图中提供该图像时,可能会帮助您走下正轨。
我的第一个想法是你打错了 - 代码同时包含 logo
和 logos
路径。
然后我用 canvas 安装了 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"));
Canvas 需要完整路径或 chdir() 到它,它可以很容易地检查,例如Intervention\Image\Image
源文件(./vendor/intervention/image/src/Intervention/Image/Image.php
)。
save
方法包含简单的 $saved = @file_put_contents($path, $data);
并且没有任何 chdir
调用。