Laravel по-русски

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

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

#1 15.02.2015 01:08:39

Загрузка файлов (изображений).

Подскажите пожалуйста урок, статью или чтото вроде того как правильно загружать изображения с помощью Laravel в указанную папку и добавлением ссылки на этот файл в БД.

Не в сети

#2 15.02.2015 11:21:56

Re: Загрузка файлов (изображений).

Мне тоже интересно, особенно куда загружать...

Не в сети

#3 15.02.2015 14:42:39

Re: Загрузка файлов (изображений).

Урок не урок)), а пример есть.
http://image.intervention.io/use/uploads

Не в сети

#4 15.02.2015 16:59:25

Re: Загрузка файлов (изображений).

HunterNomad пишет:

Урок не урок)), а пример есть.
http://image.intervention.io/use/uploads

Это библиотека, а хочется норм пример...

Не в сети

#5 15.02.2015 22:34:45

Rodion

Re: Загрузка файлов (изображений).

%%(php)
public function postUpload() {     
        $file = Input::get('photo');
        if(!isset($file))
            return Response::json([
                'status' => 'error',
                'errors' => ['error'=>'Ошибка! Вы не выбрали файл.']
            ], 400);
        $destinationPath = 'uploads/';
        $filename = str_random(12);
        list($type, $file) = explode(';', $file);
        list(, $file)      = explode(',', $file);
        $file = base64_decode($file);
        $photo = file_put_contents($destinationPath.$filename, $file);

        if($photo)
            return Response::json([
                "status" => "ok",
                "link" => "uploads/" . $filename
            ], 200);
       return Response::json([
           'status'=>'error',
           'errors'=>['error'=>'Ошибка! Попробуйте позже']
       ], 400);
    }
%%

#6 15.02.2015 22:47:12

Re: Загрузка файлов (изображений).

Выше предложенное решение принимает файл в виде строки в base_64 и сохраняет в директории public/uploads с случайным именем. Код Frontend'a могу тоже приложить, но он для AngularJS. Также можно принять файл через File::get() путем принятия формы или через Jquery.ajax передав данные формы с помощью FormData

Изменено GONG (15.02.2015 22:49:03)

Не в сети

#7 16.02.2015 18:35:21

Re: Загрузка файлов (изображений).

dima9595 пишет:
HunterNomad пишет:

Урок не урок)), а пример есть.
http://image.intervention.io/use/uploads

Это библиотека, а хочется норм пример...

А это не пример?)))

// read image from temporary file
$img = Image::make($_FILES['image']['tmp_name']);

// resize image
$img->fit(300, 200);

// save image
$img->save('foo/bar.jpg');

Не в сети

#8 16.02.2015 19:59:33

Re: Загрузка файлов (изображений).

HunterNomad пишет:
dima9595 пишет:
HunterNomad пишет:

Урок не урок)), а пример есть.
http://image.intervention.io/use/uploads

Это библиотека, а хочется норм пример...

А это не пример?)))

// read image from temporary file
$img = Image::make($_FILES['image']['tmp_name']);

// resize image
$img->fit(300, 200);

// save image
$img->save('foo/bar.jpg');

Я имел ввиду пример, который написан на Laravel без сторонних библиотек)

Не в сети

#9 16.02.2015 20:08:14

nemocoder
Откуда: Almaty, Kazakhstan
Сообщений: 69

Re: Загрузка файлов (изображений).

 if (Input::hasFile('file')) {
                $dir = '/uploads'.date('/Y/m/d/');
            
            do {
                $filename = str_random(30).'.jpg';
            } while (File::exists(public_path().$dir.$filename));
            Input::file('file')->move(public_path().$dir, $filename);
            $profile->image = $dir.$filename;
            $profile->save();
            }

делал чисто для jpg но поставишь при валидации (mime) и тд сможешь сделать все, можешь имя сделать оригинальным именем и расширением

Не в сети

#10 16.02.2015 21:30:38

Re: Загрузка файлов (изображений).

nemocoder пишет:
 if (Input::hasFile('file')) {
                $dir = '/uploads'.date('/Y/m/d/');
            
            do {
                $filename = str_random(30).'.jpg';
            } while (File::exists(public_path().$dir.$filename));
            Input::file('file')->move(public_path().$dir, $filename);
            $profile->image = $dir.$filename;
            $profile->save();
            }

делал чисто для jpg но поставишь при валидации (mime) и тд сможешь сделать все, можешь имя сделать оригинальным именем и расширением

благодарю за пример!

Не в сети

#11 10.03.2015 18:53:30

Arat
Откуда: Киев
Сообщений: 116

Re: Загрузка файлов (изображений).

А пример выше подходит для мультизагрузки нескольких изображений?

Не в сети

#12 10.03.2015 20:02:58

Re: Загрузка файлов (изображений).

Arat пишет:

А пример выше подходит для мультизагрузки нескольких изображений?

А проверить?

Для загрузки нескольких файлов, нужно:
1. Переименовать поле формы в массив:

<input name="images[]" type="file" multiple>

2. Обойти полученные файлы в цикле

foreach(Input::file('images') as $image)
{
    $image->move();
}

Не в сети

#13 15.11.2016 09:12:32

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

Re: Загрузка файлов (изображений).

dima9595 пишет:

Я имел ввиду пример, который написан на Laravel без сторонних библиотек)

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


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

Не в сети

#14 15.11.2016 11:51:06

Re: Загрузка файлов (изображений).

Ребят, а почему не написать это на чистом php? И кода меньше, и универсальности больше.
Одна ведь функция всего: move_uploaded_file().

В общем, кому пример на чистом php?

Не в сети

#15 16.11.2016 09:20:10

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

Re: Загрузка файлов (изображений).

tmanager пишет:

Ребят, а почему не написать это на чистом php? И кода меньше, и универсальности больше.
Одна ведь функция всего: move_uploaded_file().

В общем, кому пример на чистом php?

Вот решение. Также не особо длинное:

Добавить в контролере в store()

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

Добавить в форму в отображении:

{!! Form::label('image', 'Фотография:') . Form::file('image_file',['class' => 'form-control'])!!}

Как записать в базу данных пока не додумался.


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

Не в сети

#16 16.11.2016 09:41:41

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

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

Не в сети

#17 16.11.2016 15:46:28

Re: Загрузка файлов (изображений).

tmanager пишет:

Ребят, а почему не написать это на чистом php? И кода меньше, и универсальности больше.
Одна ведь функция всего: move_uploaded_file().

В общем, кому пример на чистом php?


Мне, пожалуйста.

Не в сети

#18 16.11.2016 17:39:13

Re: Загрузка файлов (изображений).

sherita пишет:
tmanager пишет:

Ребят, а почему не написать это на чистом php? И кода меньше, и универсальности больше.
Одна ведь функция всего: move_uploaded_file().

В общем, кому пример на чистом php?


Мне, пожалуйста.

Пришлю, только сегодня вечером или завтра утром. Я в пути smile

Не в сети

#19 17.11.2016 10:42:39

Re: Загрузка файлов (изображений).

//fieldName  - имя input type="file"

if(isset($_FILES['fieldName'])) //Пришли данные из формы
	if($_FILES['fieldName']['size'] > 0) //Файл закачался
	{
		//Изучим, что это нам закачали (getimagesize() - в ядре)
		$info=getimagesize($_FILES['fieldName']['tmp_name']);

		if($info === false) //Закачали НЕ изображение
			{
			//Обрабатываем ошибку
			}
		else
			{
			$ext = 'jpg'; //расширение файла
			switch($info[2]) 
				{
				case IMG_GIF:
					$ext = 'gif';
					break;
				case IMG_PNG:
					$ext = 'png';
					break;
				case IMG_JPEG :
					break;
				default:
					//Как-то реагируйте на то, что не веб-формат
					break;
				}

			//$conn - это подключение к базе данных. Внутри метода надо будет написать 
			//global $conn;

			//Создадим таблицу для того, чтоб делать уникальные имена файлам 
			//create table pictures(id int primary key  auto_increment);

			$query='insert into pictures() values()';
			mysqli_query($conn,$query);
			$id=mysqli_insert_id($conn);

			//формируете по своей логике путь к файлу. Например:
			$filename=__DIR__.'/../../images/users/image'.$id.'.'.$ext;

			//Закачиваем файл
			move_uploaded_file($_FILES['fieldName']['tmp_name'], $filename);

			if(!file_exists($filename))
				{
				//Обрабатывайте ошибку - скорее всего, права доступа на папку
				}
			else
				{
				//формируете по своей логике URL файла. Например:
				$url = '/images/users/image'.$id.'.'.$ext;

				//Ну теперь и записываем его... куда его надо записать? Ну например:

				$query="insert into userfiles(url,width,height) values('$url',".$info[0].",".$info[1].")";
				mysqli_query($conn,$query);
				}
			}
	}

Не в сети

#20 17.11.2016 10:53:38

Re: Загрузка файлов (изображений).

Об такой пример кода глаза сломаешь, неужели нельзя нормально его отформатировать? Очень странное расположение { }, отсутствие пробелов, глобальные переменные, создание таблицы в момент загрузки (что значит лишние привилегии пользователю БД) и т.д.

Короче, хороший пример, как не надо писать на PHP. Аж почувствовал дыхание из рубежа 90-00.

Не в сети

#21 17.11.2016 10:58:50

Re: Загрузка файлов (изображений).

Proger_XP пишет:

Об такой пример кода глаза сломаешь, неужели нельзя нормально его отформатировать?

дело вкуса. Мне так нравится. Кому иначе нравится - недолго и отформатировать

Proger_XP пишет:

создание таблицы в момент загрузки (что значит лишние привилегии пользователю БД)

Нет там создания таблицы в момент загрузки.
Есть комментарий, отражающий структуру таблицы.

Proger_XP пишет:

Аж почувствовал дыхание из рубежа 90-00.

Дыхание просвещенных времен.

Не в сети

#22 17.11.2016 11:12:48

Re: Загрузка файлов (изображений).

Уменьшил отступы - и сделал более понятный комментарий про таблицу:

//fieldName  - имя input type="file"

if(isset($_FILES['fieldName'])) //Пришли данные из формы
  if($_FILES['fieldName']['size'] > 0) //Файл закачался
    {
    //Изучим, что это нам закачали (getimagesize() - в ядре)
    $info=getimagesize($_FILES['fieldName']['tmp_name']);

    if($info === false) //Закачали НЕ изображение
	{
	//Обрабатываем ошибку
	}
    else
       {
	$ext = 'jpg'; //расширение файла
	switch($info[2]) 
	{
	   case IMG_GIF:
		$ext = 'gif';
		break;
	   case IMG_PNG:
		$ext = 'png';
		break;
	   case IMG_JPEG :
		break;
	   default:
		//Как-то реагируйте на то, что не веб-формат
		break;
	 }

	//$conn - это подключение к базе данных. Внутри метода надо будет написать 
	//global $conn;

	//Нужно создать таблицув базе  для того, чтоб делать уникальные имена файлам 
	//Вот её структура
	//create table pictures(id int primary key  auto_increment);

	$query='insert into pictures() values()';
	mysqli_query($conn,$query);
	$id=mysqli_insert_id($conn);

	//формируете по своей логике путь к файлу. Например:
	$filename=__DIR__.'/../../images/users/image'.$id.'.'.$ext;

	//Закачиваем файл
	move_uploaded_file($_FILES['fieldName']['tmp_name'], $filename);

	if(!file_exists($filename))
	   {
	   //Обрабатывайте ошибку - скорее всего, права доступа на папку
	   }
	else
	   {
	   //формируете по своей логике URL файла. Например:
	   $url = '/images/users/image'.$id.'.'.$ext;

	   //Ну теперь и записываем его... куда его надо записать? Ну например:

	    $query="insert into userfiles(url,width,height) values('$url',".$info[0].",".$info[1].")";
	    mysqli_query($conn,$query);
	   }
	}
   }

Не в сети

#23 17.11.2016 11:23:05

Re: Загрузка файлов (изображений).

  1. Дыхание просвещенных времен.

WordPress?

  1. Уменьшил отступы — и сделал более понятный комментарий про таблицу:

У меня скобки на том же уровне, что и вложенный блок, вызывают когнитивный диссонанс. Но это ладно. В коде мешанина из пробелов и табов — уж либо одно, либо другое. У меня длина таба выставлена в 2 символа, из-за чего форматирование расползается после вставки в редактор.

Ну не пишут так «просвещённые» люди. После запятых и if и switch нужны пробелы, между равно тоже. Иначе код write-only. Страшно подумать, как выглядит ваш проект.

Хотя бы так:

PHP
// fieldName  - имя input type="file"

if (isset($_FILES['fieldName'])) // Пришли данные из формы
  
{
  if (
$_FILES['fieldName']['size'] > 0// Файл закачался
    
{
    
// Изучим, что это нам закачали (getimagesize() - в ядре)
    
$info getimagesize($_FILES['fieldName']['tmp_name']);

    if (
$info === false// Закачали НЕ изображение
      
{
      
// Обрабатываем ошибку
      
}
    else
      {
      
$ext 'jpg'// расширение файла
      
switch ($info[2])
        {
        case 
IMG_GIF:
          
$ext 'gif';
          break;
        case 
IMG_PNG:
          
$ext 'png';
          break;
        case 
IMG_JPEG:
          break;
        default:
          
// Как-то реагируйте на то, что не веб-формат
          
break;
        }

      
// $conn - это подключение к базе данных. Внутри метода надо будет написать
      // global $conn;

      // Нужно создать таблицув базе для того, чтоб делать уникальные имена файлам
      // Вот её структура
      // create table pictures(id int primary key  auto_increment);

      
$query 'insert into pictures() values()';
      
mysqli_query($conn$query);
      
$id mysqli_insert_id($conn);

      
// формируете по своей логике путь к файлу. Например:
      
$filename __DIR__.'/../../images/users/image'.$id.'.'.$ext;

      
// Закачиваем файл
      
move_uploaded_file($_FILES['fieldName']['tmp_name'], $filename);

      if (!
file_exists($filename))
        {
        
// Обрабатывайте ошибку - скорее всего, права доступа на папку
        
}
      else
        {
        
// формируете по своей логике URL файла. Например:
        
$url '/images/users/image'.$id.'.'.$ext;

        
// Ну теперь и записываем его... куда его надо записать? Ну например:

        
$query="insert into userfiles(url,width,height) values('$url',".$info[0].",".$info[1].")";
        
mysqli_query($conn,$query);
        }
      }
    }
  }

Не в сети

#24 17.11.2016 11:37:21

Re: Загрузка файлов (изображений).

Proger_XP пишет:

WordPress?

Нет. Времена, когда для уникальности внось создаваемого именир не использовали текущее время или генератор случайных чисел - как в примерах выше. Они у Вас когнитивного диссонанса не вызвали smile

Proger_XP пишет:

У меня скобки на том же уровне, что и вложенный блок, вызывают когнитивный диссонанс.

Сочувствую.

Proger_XP пишет:

В коде мешанина из пробелов и табов

Это не ко мне. Это к форуму, с которым я боролся, возможно, неумело. В моем редакторе все красиво.

Proger_XP пишет:

После запятых и if и switch нужны пробелы, между равно тоже. Иначе код write-only.

Тут можете глумиться - это я перфокарты экономлю smile
По привычке.

Это Ваше замечания готов принять.

Proger_XP пишет:

Страшно подумать, как выглядит ваш проект.

Но он работает - приятно удивляя быстродействием и надежностью. Уже шесть лет - в трех офисах. ERP большой фирмы.

Не в сети

#25 17.11.2016 12:22:32

Re: Загрузка файлов (изображений).

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

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

  1. У меня скобки на том же уровне, что и вложенный блок, вызывают когнитивный диссонанс.
  2. Сочувствую.

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

pascalprocedure X;
begin
  Foo;
end;
PHP
if (x) {
  
foo();
}

if (
x)
{
  
foo();
}

Зачем сознательно идти против течения, если проект предполагает наличие других разработчиков?

  1. Это не ко мне. Это к форуму, с которым я боролся, возможно, неумело. В моем редакторе все красиво.

Форум совершенно не при чём. Раз используете табы (тоже экономия перфокарт?), то надо понимать проблемы, в частности что у каждого могут быть свои настройки их длины и что редактировать их за границами вашего любимого редактора (в браузере) будет проблемно. На что вы сами же напоролись.

https://laravel.ru/packages/proger/habravel/uploads/forum-9727.png
  1. Но он работает — приятно удивляя быстродействием и надежностью. Уже шесть лет — в трех офисах. ERP большой фирмы.

Работающий код <> безопасный код и даже <> хороший код. Программы на 1С работают, но в большинстве случаев ужасны. Flash работает, но каждый год в нём находят десятки дыр (кстати, тоже продукт «просвещенного времени»). eBay работал до утечки и работает сейчас. Миллионные штрафы мало кого останавливают…

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

Не в сети

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