2017-02-03 61 views
3

使用Vagrant和Homestead运行Laraval 5.4。使用带有图像干预画布的laravel存储()

看到关于此问题的其他一些问题,但没有提供它通过干预/图片使用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; 

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

此代码提供了以下错误:

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

第一线工作,因为图像是在以下位置存储在我的存储文件夹中:

“/存储/程序/公/客户/徽标/ UupUn1iuDGRsy5Z0bkWHJ6S4v79bfZiXapTO7vLk.jpeg“

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

事情我尝试: 我试图改变$path变量中图片::使()这样的:

Storage::disk('public')->url($path) 

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

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

关于该错误的奇怪部分是'app'目录在该错误内部不可见。

我想尽办法解决这个问题。

编辑

得到它的工作,而无需使用帆布,但仍想知道的方式来使用画布()

这是我目前如何得到它的工作:

$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

我相信这是一个文件权限问题。尝试使用特权用户设置存储。 –

+0

图像保存在存储文件夹内,只是调整了大小。所以它可以写入文件夹。我试图将其设置为777,但也没有解决问题 – Christophvh

+0

我猜这是因为'$ path'变量。检查它在这里:[Refence#1](http://stackoverflow.com/questions/33468437/getting-error-notreadableexception-in-abstractdecoder-php-line-302/33469360#33469360)或者你可以试试这个人做了什么在[参考#2]中(http://stackoverflow.com/questions/41990023/how-to-save-uploaded-image-to-storage-in-laravel)。祝你好运。 –

回答

2

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

然后我用帆布安装了laravel并得到了同样的错误。所以我只是做了一些小小的改进,现在它可以工作。关键是,返回的$路径是相对的不是你的存储路径,而是存储/应用程序/公共

$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")); 

帆布需要完整路径或CHDIR()把它,可以容易在例如检查Intervention\Image\Image源文件(./vendor/intervention/image/src/Intervention/Image/Image.php)。

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

+0

哈哈,这似乎!明天在工作中试一下,会给你你的赏金。但那最后是有道理的。 – Christophvh

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提到:

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.

也许当你想在你的看法就可以提供这种形象帮助你走下赛场。

+0

这很合理,但没有解决问题,得到了同样的'图片不可读错误',但现在指的是这条路径:'home/vagrant/php-resq/storage/clients/logos/ObaIpvgexGPcOStz0jaU73BJ8AUDp2ME85lUpMoY.jpeg'这个路径中没有显示'app' – Christophvh

+0

然后你只需要在你的路径上加上''''''app /''''并且这应该可以工作。你得到'''图片不可读“的原因是因为你没有提供正确的路径。 – CUGreen

+0

添加应用程序,看起来像一个哈克解决方案,所以不是真的会这样做。没有使用画布()会让我的第一篇文章广告,所以也许有人会找到一个解决方案,基于那个 – Christophvh