Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 26.03.2015 12:48:16

Прикрепление файлов

Кто-нибудь знает как поставить https://github.com/CodeSleeve/laravel-stapler на Laravel 5?
Есть ли нормальные альтернативы CodeSleeve/laravel-stapler?

Не в сети

#2 26.03.2015 13:24:53

Re: Прикрепление файлов

я пробовал когда л5 только запустили — не работало. забил, использую Glide, в атрибуты модели имена картинок сохраняю руками.

Не в сети

#3 30.03.2015 15:14:23

Re: Прикрепление файлов

Не подскажите как организовать загрузку файлов?
В форме использую поле 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') не определяет, что существует поле с файлом.
Если есть возможность напишите, как организовать загрузку файлов?

Не в сети

#4 30.03.2015 16:05:53

Re: Прикрепление файлов

Оказалось пропустил в форме enctype = "multipart/form-data"
А как сохранить путь до файла для поля image? Почему-то сохраняется какой-то временный путь, типа: temp\phpCC3E.tmp
Хотя сам файл успешно залился в uploads/filename.jpg?

Не в сети

#5 31.03.2015 08:33:17

Re: Прикрепление файлов

вопрос непонятен — пхп помещает загруженные файлы во временную папку, куда дальше их перемещать и как запоминать куда они попали — решает уже разработчик.

Не в сети

#6 31.03.2015 10:19:33

Re: Прикрепление файлов

В реквесте приходит массив с полями, одно из которых '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)

Не в сети

#7 31.03.2015 10:34:11

Re: Прикрепление файлов

в принципе неплохо, только использование глайда какое-то странное, не совсем понятно что делает PHPGlideImage::load — генерит ресайз в публичной папке и отдаёт ссылку? отдаёт картинку в виде data:image?

мне просто интересно. я заворачиваю запросы к глайду в пхп. у меня в AppServiceProvider:

PHP
        $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',
            ]);
        });

и в routes.php:

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

Не в сети

#8 31.03.2015 11:34:56

Re: Прикрепление файлов

Выяснил в чем проблема была, оказывается нужно было изображение заливать в папку 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)

Не в сети

#9 31.03.2015 12:09:47

Re: Прикрепление файлов

Чтобы файлы залить в папку 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)

Не в сети

#10 31.03.2015 12:20:25

Re: Прикрепление файлов

Теперь возникает другой вопрос, как при загрузке файлов сразу конвертировать изображение с определенными размерами?
В laravel-Glide есть функция:

GlideImage::load('kayaks.jpg')
    ->modify(['w'=> 50, 'filt'=>'greyscale'])
    ->save($pathToWhereToSaveTheImage);

Но у меня так и не получилось в контроллере ее использовать.

Не в сети

#11 31.03.2015 13:13:06

Re: Прикрепление файлов

  1. Теперь возникает другой вопрос, как при загрузке файлов сразу конвертировать изображение с определенными размерами?

лучше не надо. вордпресс так делает, потом небольшое изменение в вёрстке, чуть другие размеры картинок, и приплыли. хранить исходное изображение в любом случае нужно, но на все отресайзенные размеры (в том числе и те, что уже не нужны, и те что нужны 0.01% пользователей) — место-то тратится. лучше пусть будет кэш — глайд его уже из коробки делает.

а для того что ты пытаешься сделать тебе глайд вообще не нужен. он под капотом использует intervention/images — вызывай её методы напрямую и все дела.

Не в сети

#12 31.03.2015 13:15:09

Re: Прикрепление файлов

Спасибо, а как Glide чистит кеш?
Такое ощущение, что он постоянно накапливается?

Не в сети

#13 31.03.2015 13:30:42

Re: Прикрепление файлов

Оказывается пока не умеет чистить кеш, у них в документации написано, но обещают в будущем поправить

Не в сети

#14 31.03.2015 15:25:02

Re: Прикрепление файлов

у глайдовского кэша ещё косяк в том, что он проверяет только имя файла и параметры. если новый файл под именем прежнего сохранить — он будет из кэша старую картинку отдавать. пул-ревест, который это фиксит они завернули: [https://github.com]

Не в сети

#15 03.09.2015 10:59:28

Re: Прикрепление файлов

Что за пакет Intervention/image? Никто не использовал? Вроде поддержка Laravel есть, также еще к нему можно прикрутить Intervention/imagecache для работы с кешем.

Не в сети

#16 03.09.2015 18:04:36

stuchin
Откуда: Волгоград
Сообщений: 68

Re: Прикрепление файлов

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

Не в сети

#17 03.09.2015 20:14:35

Artdevue
Откуда: Kiev
Сообщений: 119
Сайт

Re: Прикрепление файлов

stuchin пишет:
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.

Не в сети

#18 04.09.2015 11:45:21

Re: Прикрепление файлов

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)

Не в сети

#19 24.11.2015 13:03:38

Re: Прикрепление файлов

Как в Glide изменить файл под тем же именем или как найти в storage нужный файл glide?

Не в сети

Подвал раздела