2017-02-03 30 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

相關問題