【问题标题】:Use laravel storage with Image intervention canvas()通过图像干预 canvas() 使用 laravel 存储
【发布时间】:2017-02-03 20:38:06
【问题描述】:

使用 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->init('clients/logos/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() 的方法

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

$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)}}

【问题讨论】:

  • 我相信这是一个文件权限问题。尝试使用适当的用户权限设置存储。
  • 图像保存在存储文件夹中,只是调整大小。所以它可以写入文件夹。我尝试将其设置为 777,但这也没有解决问题
  • 我猜这是因为 $path 变量。在这里查看:Refence #1 或者你可以试试这个人在Reference #2 中所做的事情。祝你好运。
  • @Christophvh laravel 版本是什么?标题包含5.3,但标签中带有5.4

标签: php laravel intervention laravel-5.4


【解决方案1】:

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

然后我用画布安装了 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 调用。

【讨论】:

  • 啊哈,好像是这样!明天在工作中尝试一下,会给你你的赏金。但这最终是有道理的。
【解决方案2】:

使用您的代码:

$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 命令创建链接。

当您想在视图中提供该图像时,可能会帮助您走上正轨。

【讨论】:

  • 这是有道理的,但没有解决问题,得到相同的 'Image not readable error' ,但现在指的是这个路径:home/vagrant/php-resq/storage/clients/logos/ObaIpvgexGPcOStz0jaU73BJ8AUDp2ME85lUpMoY.jpeg 再次'app'没有显示在那个路径
  • 那么你只需要在你的路径前面加上app/ 就可以了。您收到Image not readable 的原因是您没有提供正确的路径。
  • 添加应用程序,似乎是一个 hacky 解决方案,所以不会真的这样做。在不使用 canvas() 的情况下让它工作会在我的第一篇文章中做广告,所以也许有人会根据它找到解决方案
猜你喜欢
  • 1970-01-01
  • 2020-01-19
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 2015-04-10
相关资源
最近更新 更多