ДОВІДНИК З NODE-RED українською мовою
Автор: Олександр Пупена
Написати фрагмент програми на Node-RED, яка буде приймати від користувача файл зображення з описом та зберігати їх у файловій системі у вигляді:
Форма повинна передбачати обов’язкове добавлення як файлу так і опису.
На боці серверу повинно бути передбачено контроль типу файлу - це має бути зображення.
У даному рішенні використовуються:
/addfilepage та у відповідь на успішне чи неуспішне приймання данихhttp-in (опис) та http-responce (опис) для реалізації HTTP серверуtemplate для формування HTML (опис)viewer із бібліотеки node-red-contrib-image-tools що відображає зображення в середовищі Node-RED (опис)write file для запису файлівПро форми можна почитати за цим посиланням.
Форма для відправки файлу з описом для цієї задачі матиме наступний вигляд:
<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 наведений нижче.

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

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

<!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>
Форма матиме вигляд:

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

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

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

Якщо потік йде по шляху відхилення запиту, то у вузлі negative формується наступний html код:
<!DOCTYPE html>
<html>
<body>
<h1>Файл не є рисунком</h1>
<a href="/addfilepage">Добавити ще один рисунок</a>
</body>
</html>
При позитивному направленні потоку файл відображається в редакторі за допомогою вузла viewer. Далі потік перенаправляється на вузол toimgfile.

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

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

Після запису в файл формується позитивний звіт у вузлі positiv в форматі:
<!DOCTYPE html>
<html>
<body>
<h1>Файл завантажено і збережено як </h1>
<a href="/addfilepage">Добавити ще один рисунок</a>
</body>
</html>
Зверніть увагу на те, що в шаблоні використовується синтаксис mustach що дозволяє передати в тексті значення імені файлу, який було збережено ``.
Паралельно до виведення звіту про запис файлу, формується ще один запис в файл реєстру рисунків. Для цього у вузлі toregistr за допомогою JSONata виразу формується що саме треба писати, як результат конкатенації:

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

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

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