NodeREDGuidUKR

ДОВІДНИК З NODE-RED українською мовою

До збірника задач

Віправка даних в Node-RED за допомогою форми

Автор: Олександр Пупена

Завдання

Написати фрагмент програми на Node-RED, яка буде приймати від користувача файл зображення з описом та зберігати їх у файловій системі у вигляді:

Форма повинна передбачати обов’язкове добавлення як файлу так і опису.

На боці серверу повинно бути передбачено контроль типу файлу - це має бути зображення.

Рішення 1

У даному рішенні використовуються:

Створення форм

Про форми можна почитати за цим посиланням.

Форма для відправки файлу з описом для цієї задачі матиме наступний вигляд:

<form action="/addfile" method = "POST" enctype="multipart/form-data" accept-charset="utf-8">
  <label for="myfile">Виберіть файл:</label>
  <input type="file" id="myfile" name="myfile" required><br>
  <label for="description">Введіть опис:</label>
  <input type="text" id="description" name="description" placeholder = "Опис рисунку" size = "50" required>
  <br><br>
  <input type="submit" value="Відправити">
</form>

Створення фрагменту застосунку Node-RED

Фрагмент застосунку в Node-RED наведений нижче.

image-20230510154010878

Запит форми

Вузол http-in в запиті форми має наступні налаштування:

image-20230510165936915

Вузол формує потік за кінцевою точкою доступу /addfilepage який направляється на вузол template з назвою from generate, який у свою чергу генерує html з формою

image-20230510170759673

<!DOCTYPE html>
<html>
<body>

<h1>Завантаження рисунку</h1>

<p>Виберіть файл рисунку та добавте до нього опис:</p>
<form action="/addfile" method = "POST" enctype="multipart/form-data" accept-charset="utf-8">
  <label for="myfile">Виберіть файл:</label>
  <input type="file" id="myfile" name="myfile" required><br>
  <label for="description">Введіть опис:</label>
  <input type="text" id="description" name="description" placeholder = "Опис рисунку" size = "50" required>
  <br><br>
  <input type="submit" value="Відправити">
</form>

</body>
</html>

Форма матиме вигляд:

image-20230510170916967

Обробка форми

Вузол http-in в запиті форми має наступні налаштування:

image-20230510171042509

Вузол формує потік за кінцевою точкою доступу /addfile який приймає дані з форми через метод POST. Зверніть увагу на те, що виставлена опція Accept file uploads? яка забезпечить передачу файлу в окремому полі vsg.get.files.

image-20230510174929943

Вузол switch який стоїть далі за потоком перенаправляє на перший вихід потік, тільки у тому випадку, коли поле mimetype починається зі слова image, у іншому випадку потік направляється на другий вихід.

image-20230510175121682

Якщо потік йде по шляху відхилення запиту, то у вузлі negative формується наступний html код:

<!DOCTYPE html>
<html>
<body>
	<h1>Файл не є рисунком</h1>
	<a href="/addfilepage">Добавити ще один рисунок</a>
</body>
</html>

При позитивному направленні потоку файл відображається в редакторі за допомогою вузла viewer. Далі потік перенаправляється на вузол toimgfile.

image-20230510154010878

Вузол toimgfile переформатовує потік таким чином, щоб файл записувався у локальній файловій системі. По перше, значення description зберігається на верхньому рівні повідомлення msg. Це зроблено для того, щоб при заміні payload воно не втратилося в потоці.

image-20230510180115573

У властивості filename зберігається значення конкатенації шляху розміщення файлу з мілісекундами і оригінальної назви файлу. Потім зміст файлу (files[0].buffer) записується в payload. Ці властивості використовуються вузлом payload для запису в файл.

image-20230510213740413

Після запису в файл формується позитивний звіт у вузлі positiv в форматі:

<!DOCTYPE html>
<html>
<body>
	<h1>Файл завантажено і збережено як </h1>
	<a href="/addfilepage">Добавити ще один рисунок</a>
</body>
</html>

Зверніть увагу на те, що в шаблоні використовується синтаксис mustach що дозволяє передати в тексті значення імені файлу, який було збережено ``.

Паралельно до виведення звіту про запис файлу, формується ще один запис в файл реєстру рисунків. Для цього у вузлі toregistr за допомогою JSONata виразу формується що саме треба писати, як результат конкатенації:

image-20230510214555016

Наступний вузол write to file має наступний вигляд.

image-20230510214907606

Зверніть увагу на опції, які дозволяють записувати текст окремими рядками, добавляючи їх у існуючий файл.

image-20230510215714665

Експорт потоку доступний за посиланням