Clone
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
FTP/SFTP Галерея
Настройка
В settings.json → ftpConfig:
{
"protocol": "sftp", // "ftp" или "sftp"
"host": "212.113.122.5",
"port": 22, // 21 для FTP, 22 для SFTP
"user": "reaspekt",
"password": "...", // маскируется в API-ответе
"remotePath": "public/newsletter_2026",
"baseUrl": "https://email-files.vipavenue.ru/newsletter_2026"
}
Библиотеки: basic-ftp (FTP), ssh2-sftp-client (SFTP).
Загрузка картинок
Из конструктора (drag-and-drop)
- Перетаскиваешь картинку на поле
srcблока handleImageDrop()→ если FTP настроен и у письма есть дата → загружает на FTP- Иначе → загружает локально (
/api/upload-image) - URL подставляется в поле блока
Из галереи (модал)
- Кнопка FTP-галереи на поле картинки
- Открывается модал с миниатюрами из папки
{remotePath}/{дата-письма}/ - Можно выбрать существующую картинку или загрузить новую
Пакетная загрузка
<input type="file" multiple>— выбор нескольких файлов- Загрузка последовательная (
for...ofс await), не параллельная event.target.value = ''после загрузки — для повторного выбора тех же файлов- Прогресс:
ftpUploadProgress/ftpUploadPercent
Безопасность FTP
- Path traversal:
folderпроверяется на..и абсолютные пути - Имя файла:
fileName.replace(/[^a-zA-Z0-9а-яА-ЯёЁ_-]/g, '_') - Макс размер: 20 МБ (base64 в body)
- Типы файлов: png, jpg, gif, webp
Автонумерация картинок
Функция applyAutoImageNumbers():
- Берёт
imageBaseUrlиimageExtиз настроек - Проходит по всем блокам с пустыми полями
src - Присваивает последовательные номера:
{baseUrl}image__01_.png,image__02_.png, ...
Кэширование галереи
ftpGalleryCache — Map {folder: files[]} в памяти клиента. При загрузке новой картинки — файл добавляется в кэш без повторного запроса к FTP.
Модал галереи
- Размер:
max-width: 1100px - Сетка миниатюр:
max-height: 55vh, миниатюрыheight: 100px - Клик на миниатюру → копирует URL в поле блока
- Кнопка удаления на каждой миниатюре (с подтверждением)
- Кнопка "Обновить" для перезагрузки списка