Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Кто-нибудь знает как поставить https://github.com/CodeSleeve/laravel-stapler на Laravel 5?
Есть ли нормальные альтернативы CodeSleeve/laravel-stapler?
Не в сети
Не в сети
Не подскажите как организовать загрузку файлов?
В форме использую поле image для загрузки фото:
<div class="row form-group">
<div class="col-md-2"> {!! Form::label('image', 'Изображение') !!} </div>
<div class="col-md-4"> {!! Form::file('image', null, ['class' => 'form-control']) !!} </div>
</div>
Также используется PageRequest, для валидации, в нем
'image' => 'image|between:50, 2000',
т.е. предполагается что в этом поле будет файл, размером от 50 до 2000 кб
При этом при загрузке файла и создании страницы Page появляются ошибки что поле должно быть изображением и размер не правильный, хотя выбираю стандартные фото из проводника с размером около 500кб.
Если смотреть по документации то в контроллере должно быть:
if (Request::hasFile('image'))
{
//
}
Но до этого не доходит, т.к. PageRequest не пускает, если убрать из PageRequest проверку image, то Request::hasFile('image') не определяет, что существует поле с файлом.
Если есть возможность напишите, как организовать загрузку файлов?
Не в сети
Оказалось пропустил в форме enctype = "multipart/form-data"
А как сохранить путь до файла для поля image? Почему-то сохраняется какой-то временный путь, типа: temp\phpCC3E.tmp
Хотя сам файл успешно залился в uploads/filename.jpg?
Не в сети
Не в сети
В реквесте приходит массив с полями, одно из которых 'image' - файл картинка, в базе у меня тоже поле 'image' - имя файла. При выполнении
$page->update($request->all());
в поле 'image' бд записывается что-то типа temp\phpCC3E.tmp.
Проблему решил переименованием поля в image_file, а в контроллере добавлением в массив реквеста поля 'image' и обновления всех полей:
$file = $request->file('image_file');
$filename = $file->getClientOriginalName();
$request['image'] = $filename;
$page->update($request->all());
Запись файла в папку public/images через функцию в контроллере:
$file = $request->file('image_file');
$filename = $file->getClientOriginalName();
$file->move('images', $filename);
проходит нормально. Как потом к этой фотографии применить Glide, во вьюхе пишу:
<img src="{{ GlideImage::load($page->image)->modify(['w'=> 50, 'filt'=>'greyscale']) }}" alt="{{ $page->title }}"/>
где $page->image - имя файла картинки, которая лежит в public/images.
При этом фотография выводится со своими размерами, т.е. 1024x768 вместо 50px
В конфиге config/laravel-glide.php
<?php
return [
'source' => [
'path' => storage_path('images'),
],
'cache' => [
'path' => storage_path('glide/cache'),
],
'baseURL' => 'uploads',
'maxSize' => 2000 * 2000,
'useSecureURLs' => true
];
Что делаю не так?
Изменено Johnson (31.03.2015 10:22:02)
Не в сети
в принципе неплохо, только использование глайда какое-то странное, не совсем понятно что делает PHPGlideImage::load
— генерит ресайз в публичной папке и отдаёт ссылку? отдаёт картинку в виде data:image?
мне просто интересно. я заворачиваю запросы к глайду в пхп. у меня в AppServiceProvider:
$this->app->singleton('League\Glide\Server', function ($app)
{
$fs = $app->make('Illuminate\Contracts\Filesystem\Filesystem');
return GlideFactory::create([
'driver' => env('IMAGE_DRIVER', 'imagick'),
'max_image_size' => 1000 * 1000,
'source' => $fs->getDriver(),
'cache' => $fs->getDriver(),
'source_path_prefix' => 'images',
'cache_path_prefix' => 'images/.cache',
'base_url' => 'img',
]);
});
get('img/{path}', function (\League\Glide\Server $server, \Illuminate\Http\Request $request) {
$server->outputImage($request);
})->where("path", '.+');
теперь изображения открываются через что-то типа
xml<img src="/img/{{ $p->photo }}?w=124&h=124&fit=max" srcset="/img/{{ $p->photo }}?w=248&h=248&fit=max 2x, /img/{{ $p->photo }}?w=372&h=372&fit=max 3x">
перед запуском в продакшен заменю простой /img на набор url’ов с готовыми пресетами, чтоб параметрами на улицу не светить. может отдельный ImageController заделаю — когда в маршрутах есть Closure в ларе не работает artisan route:cache.
Изменено constb (31.03.2015 10:37:20)
Не в сети
Выяснил в чем проблема была, оказывается нужно было изображение заливать в папку storage. Т.е. я принудительно закинул фото foto.jpg в папку storage/images, после чего во вьюхе прописал:
<img src="{{ GlideImage::load('foto/foto.jpg')->modify(['w'=> 50, 'filt'=>'greyscale']) }}" />
и вуаля все заработало.
При этом в AppServiceProvider и в routes.php ничего не дописывал, использовал пакет freekmurze/laravel-glide и делал все по инструкции.
Теперь возникает вопрос, как залить фото в папку storage/images?
Изменено Johnson (31.03.2015 11:35:18)
Не в сети
Чтобы файлы залить в папку storage нужно прописать в контроллере:
if ($request->hasFile('image_file'))
{
$file = $request->file('image_file');
$filename = $file->getClientOriginalName();
\Storage::put('/images/'.$filename, \File::get($file));
}
Т.к. в конфиге config/filesystems.php у нас прописано:
'root' => storage_path().'/app',
то изображение попадет в папку storage/app/images/ Меняем пути в конфиге config/laravel-glide.php
<?php
return [
'source' => [
'path' => storage_path('app/images'),
],
'cache' => [
'path' => storage_path('app/images/cache'),
],
'baseURL' => 'img',
'maxSize' => 2000 * 2000,
'useSecureURLs' => true
];
После чего выводим во вьюхе наши фото через Glide:
<img src="{{ GlideImage::load($page->image)->modify(['w'=> 50, 'filt'=>'greyscale']) }}" alt="{{ $page->title }}" />
где $page->image - это имя файла, ренее сохраненного в storage/app/images/
Изменено Johnson (31.03.2015 12:14:05)
Не в сети
Теперь возникает другой вопрос, как при загрузке файлов сразу конвертировать изображение с определенными размерами?
В laravel-Glide есть функция:
GlideImage::load('kayaks.jpg')
->modify(['w'=> 50, 'filt'=>'greyscale'])
->save($pathToWhereToSaveTheImage);
Но у меня так и не получилось в контроллере ее использовать.
Не в сети
- Теперь возникает другой вопрос, как при загрузке файлов сразу конвертировать изображение с определенными размерами?
лучше не надо. вордпресс так делает, потом небольшое изменение в вёрстке, чуть другие размеры картинок, и приплыли. хранить исходное изображение в любом случае нужно, но на все отресайзенные размеры (в том числе и те, что уже не нужны, и те что нужны 0.01% пользователей) — место-то тратится. лучше пусть будет кэш — глайд его уже из коробки делает.
а для того что ты пытаешься сделать тебе глайд вообще не нужен. он под капотом использует intervention/images — вызывай её методы напрямую и все дела.
Не в сети
Спасибо, а как Glide чистит кеш?
Такое ощущение, что он постоянно накапливается?
Не в сети
Оказывается пока не умеет чистить кеш, у них в документации написано, но обещают в будущем поправить
Не в сети
у глайдовского кэша ещё косяк в том, что он проверяет только имя файла и параметры. если новый файл под именем прежнего сохранить — он будет из кэша старую картинку отдавать. пул-ревест, который это фиксит они завернули: [https://github.com]
Не в сети
Что за пакет Intervention/image? Никто не использовал? Вроде поддержка Laravel есть, также еще к нему можно прикрутить Intervention/imagecache для работы с кешем.
Не в сети
Что за пакет Intervention/image? Никто не использовал? Вроде поддержка Laravel есть, также еще к нему можно прикрутить Intervention/imagecache для работы с кешем.
вот рабочий код
if ($image = Input::file('photo'))
{
$filename = str_random(6) . '.' . $image->getClientOriginalExtension();
$path = public_path('/uploads/' . $filename);
$resizedImage = Image::make($image->getRealPath())->resize(200, 200);
$resizedImage->response('jpg');
Storage::put('uploads/' . $filename, $resizedImage);
}
Не в сети
Johnson пишет:Что за пакет Intervention/image? Никто не использовал? Вроде поддержка Laravel есть, также еще к нему можно прикрутить Intervention/imagecache для работы с кешем.
вот рабочий код
if ($image = Input::file('photo'))
{
$filename = str_random(6) . '.' . $image->getClientOriginalExtension();
$path = public_path('/uploads/' . $filename);
$resizedImage = Image::make($image->getRealPath())->resize(200, 200);
$resizedImage->response('jpg');
Storage::put('uploads/' . $filename, $resizedImage);
}
Зачем всё усложнять? Для чего вы получаете переменную $path, если её не используете?
Ну и если уже пошли путём Intervention Image, так продолжайте:
код
$resizedImage = Image::make($image->getRealPath())->resize(200, 200);
продолжаем
Image::make($image->getRealPath())->resize(200, 200)->save($path,80);
Изменено Artdevue (03.09.2015 20:15:10)
If you think it’s expensive to hire a professional to do the job, wait until you hire an amateur.
Не в сети
Intervention Image интересует в частности в сравнении с Glide?
В Glide чтобы вывести фото нужного размера вызываем:
{{<img class="thumb" src="{{ GlideImage::load($page->image)->modify(['w'=> 200]) }}" />
В итоге изображение берется из кеша, что очень удобно и просто.
Как я понял Intervention Image может только делать какие-то манипуляции с фото и все, т.е. код:
$resizedImage = Image::make('uploads/foto.jpg')->resize(200, 200);
не вернет фото, нужно сначала изменить фото и переименовать его, а потом использовать, что по сравнению с Glide не очень удобно.
Также так и не понял из документации, как Intervention Image работает с кешем, там есть пакет intervention/imagecache, однако у меня так и не получилось добиться от него результата, хотя старался делать по инструкции, поэтому, если кто-нибудь может описать плюсы Intervention Image, особенно по отношению к Glide, пожалуйста напишите...
Изменено Johnson (04.09.2015 11:46:26)
Не в сети
Как в Glide изменить файл под тем же именем или как найти в storage нужный файл glide?
Не в сети
Страницы 1