Используйте хранилище laravel с холстом изображения ()

Запуск Laraval 5.4 с бродягой и усадьбой.

Увидел еще несколько вопросов по этой проблеме, но ни одно из них не обеспечило решение, которое использует метод canvas () методом Intervention / Image

Laravel представила более легкую систему хранения с 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 в строке AbstractDecoder.php 335: Источник изображения не читается в AbstractDecoder.php строке 335 в AbstractDecoder-> init ('clients / logos / UupUn1iuDGRsy5Z0bkWHJ6S4v79bfZiXapTO7vLk.jpeg') в строке AbstractDriver.php 64

Первая строка работает, потому что изображение хранится в моей папке хранения в следующем месте:

"/storage/app/public/clients/logo/UupUn1iuDGRsy5Z0bkWHJ6S4v79bfZiXapTO7vLk.jpeg"

но изображение хранится в полноразмерном виде, поэтому код не работает на части изображения.

Я попытался изменить переменную $path внутри Image :: make ():

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

Related of "Используйте хранилище laravel с холстом изображения ()"

Моя первая мысль заключалась в том, что у вас есть опечатка – код содержит как logo и logos .

Затем я установил laravel с холстом и получил ту же ошибку. Поэтому я только что немного улучшил путь, и теперь он работает. Ключевым моментом является то, что возвращаемый путь $ относителен не к пути хранения, а к хранилищу / приложению / 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")); 

Для холста нужны полные пути или chdir () , его можно легко проверить в файле Intervention\Image\Image source. ( ./vendor/intervention/image/src/Intervention/Image/Image.php ).

Метод save содержит простые $saved = @file_put_contents($path, $data); и никакого вызова chdir .

С кодом:

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

Стоит отметить, что это не было протестировано, но я бы предположил, что это ваша проблема.

Edit: Кроме того, при использовании Storage::disk('public')->url($path) он вернет storage/ путь относительно вашего общего каталога. Поэтому, как отмечают в документах :

Каталог storage/app/public доступа может использоваться для хранения создаваемых пользователем файлов, таких как аватары профиля, которые должны быть общедоступными. Вы должны создать символическую ссылку в public/storage которая указывает на этот каталог. Вы можете создать ссылку, используя команду php artisan storage:link .

Можете помочь вам спуститься по дорожке, когда вы хотите воспроизвести это изображение в своем представлении.