Laravel по-русски

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

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

#1 15.11.2016 09:36:03

Mick_20
Откуда: Кемерово
Сообщений: 39
Сайт

Запись о изображении в БД

Здравствуйте,

Реализовал загрузку картинки на сервер.

public function store(Article $postModel, ArticlesAddRequest $request)
	{
		$postModel->create($request->all());

		$file = $request->file('image_file');
		$filename = $file->getClientOriginalName();
		$file->move('../images', $filename);//папка

		return redirect()->route('articles');
	}

Как сделать чтобы имя картинки также записывалось в БАЗУ?


Открываю для себя Laravel. Как бы не закрыть.

Не в сети

#2 15.11.2016 10:29:34

Re: Запись о изображении в БД

Зачем? ФС лучше подходит для хранения статики, БД в большинстве случаев менее походит для хранения больших строк и раздавать файлы нужно будет через скрипт, который предварительно будет вытаскивать файлы из БД, что создаст ненужную нагрузку. А если скриптом кэшировать файлы на диск, то зачем тогда хранить их в БД?

Не в сети

#3 15.11.2016 10:30:12

Re: Запись о изображении в БД

Mick_20 пишет:

Как сделать чтобы имя картинки также записывалось в БАЗУ?

Вы, батенька, страшный человек... :-)
Вот мой "грязный" код. Поле 'avatar', естественно, должно быть в таблице.

    public function update(Request $request, $id) {
        $this->validate($request, [
            'name' => 'required|max:100',
            'sex' => 'required|in:мужской,женский',
            'avatar' => 'mimes:jpeg,jpg,png,gif|max:1000'
        ]);

        try {

            $avatar_path = '';

            if (Input::hasFile('avatar')) {
                $file = Input::file('avatar');
                $extension = $file->getClientOriginalExtension();
                $filepath = public_path() . '/assets/img/users/' . $id . '/';
                $filename = 'ava' . $id . '.' . $extension;
                $avatar_path = asset('assets/img/users/' . $id . '/' . $filename);
                $file->move($filepath, $filename);
            }

            if ($avatar_path) {
                $user = User::find($id);
                $user->name = $request->name;
                $user->sex = $request->sex;
                $user->avatar = $avatar_path;
                $user->save();
            } else {
                $user = User::find($id);
                $user->name = $request->name;
                $user->sex = $request->sex;
                $user->save();
            }

            return Redirect::back(301)
                            ->with('success', 'Данные успешно обновлены');
        } catch (Exception $e) {
            return Redirect::back()
                            ->with('error', $e->getMessage());
        }
    }

Только не спрашивайте больше, тут все ясно более чем. Даже, возможно, лучше сделаете.

Изменено Androbim (15.11.2016 10:34:21)

Не в сети

#4 15.11.2016 10:33:10

Re: Запись о изображении в БД

Proger_XP пишет:

Зачем? ФС лучше подходит для хранения статики, БД в большинстве случаев менее походит для хранения больших строк и раздавать файлы нужно будет через скрипт, который предварительно будет вытаскивать файлы из БД, что создаст ненужную нагрузку. А если скриптом кэшировать файлы на диск, то зачем тогда хранить их в БД?

Опа... Так он же спросил про имя, а не BLOB заливать... А как еще можно сделать?

Изменено Androbim (15.11.2016 10:33:25)

Не в сети

#5 15.11.2016 10:44:32

Re: Запись о изображении в БД

  1. Опа… Так он же спросил про имя, а не BLOB заливать… А как еще можно сделать?

Да, это я пропустил «имя» и прочитал просто «картинки». С именем всё тривиально.

Не в сети

#6 15.11.2016 12:42:28

Re: Запись о изображении в БД

имя для файла бери либо $file->getName()
либо сделай генератор таких имён вида md5(time().$file->getName().time())
лучше генератор, чтобы не "личили"

Не в сети

#7 15.11.2016 12:51:55

Re: Запись о изображении в БД

Спасибо!

Не в сети

#8 15.11.2016 12:52:42

Re: Запись о изображении в БД

  1. либо сделай генератор таких имён вида md5(time().$file->getName().time())

С точки зрения энтропии наличие двух time() ничем не лучше одного. В дополнение к time() лучше использовать секретную фразу, типа того ключа, который Laravel генерирует при установке.

Не в сети

#9 15.11.2016 14:20:08

Re: Запись о изображении в БД

Proger_XP пишет:

}%> либо сделай генератор таких имён вида md5(time().$file->getName().time())
С точки зрения энтропии наличие двух time() ничем не лучше одного. В дополнение к time() лучше использовать секретную фразу, типа того ключа, который Laravel генерирует при установке.

Это не сточки зрения энтропии, а с точки зрения удлинения стринга smile средствами не требующими создания утилит-их генерящих )))

Не в сети

#10 15.11.2016 14:42:49

Re: Запись о изображении в БД

  1. Это не сточки зрения энтропии, а с точки зрения удлинения стринга ☺

Ну так длина хэша одинакова и не зависит от длины строки на входе.

Не в сети

#11 15.11.2016 21:07:05

Re: Запись о изображении в БД

Proger_XP пишет:

}%> Это не сточки зрения энтропии, а с точки зрения удлинения стринга smile
Ну так длина хэша одинакова и не зависит от длины строки на входе.

так я не о свойстве хеша, а его сугубо вариативности smile

Не в сети

#12 16.11.2016 09:28:05

Mick_20
Откуда: Кемерово
Сообщений: 39
Сайт

Re: Запись о изображении в БД

Androbim пишет:

Только не спрашивайте больше, тут все ясно более чем. Даже, возможно, лучше сделаете.

У меня нет $id я не могу обратиться к модели.

Я пока делаю для формы создания статьи.

public function store(Article $postModel, ArticlesAddRequest $request) 
	{
		$postModel->create($request->all());

		$file = $request->file('image_file');
		$filename = $file->getClientOriginalName();
		$file->move('../images', $filename);

		return redirect()->route('articles');
	}

Открываю для себя Laravel. Как бы не закрыть.

Не в сети

#13 16.11.2016 09:40:21

Mick_20
Откуда: Кемерово
Сообщений: 39
Сайт

Re: Запись о изображении в БД

В общем разобрался. Сделал так:

public function store(Article $postModel, ArticlesAddRequest $request) //валидация данных в файле app/Http/Requests/ArticlesAddRequest.php и сохранение данных формы
	{
		$artcl = $postModel->create($request->all());//записываем в базу

		$file = $request->file('image_file');
		$filename = $file->getClientOriginalName();
		$file->move('../images', $filename);//папка для загрузки изображения

		if($filename)
		{
			$article = Article::find($artcl->id);
                        $article->image = 'images/'.$filename;
                        $article->save();
		}

		return redirect()->route('articles');
	}

Изменено Mick_20 (16.11.2016 09:40:45)


Открываю для себя Laravel. Как бы не закрыть.

Не в сети

#14 16.11.2016 09:51:10

Re: Запись о изображении в БД

Ну вот, а я только-только хотел написать, что не собираюсь за Вас текучку выполнять :-)

Не в сети

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