Вставьте по адресу
editor.insertImage({ src: '/uploads/picture.png', alt: 'Описание', width: 640, height: 480 });
Изображения доступны в base/pro; insertImage возвращает boolean. Изображение inline, заменяет выделение одной операцией истории. src обязателен; alt/title — текст; размеры — целые 1–10000. Допустимы HTTP(S), относительные адреса и ограниченные raster data URL PNG/JPEG/GIF/WebP. Blob/file/javascript и SVG data URL запрещены.
Подключите загрузку
В превью конструктора файл можно выбрать в диалоге изображения. Он читается локально и встраивается в HTML как data URL; на сервер сайта файл не отправляется. Чтобы загрузка работала в вашем приложении и изображения хранились отдельно, задайте callback uploadImage, возвращающий постоянный URL. Без callback диалог предлагает только адрес изображения.
const editor = new ViText('#editor', {
preset: 'base',
uploadImage: async (file, { signal }) => {
const body = new FormData(); body.append('image', file);
const response = await fetch('/api/images', { method: 'POST', body, signal });
if (!response.ok) throw new Error('Загрузка не выполнена');
const result = await response.json();
return { src: result.url, alt: file.name };
}
});
/api/images — маршрут вашего приложения, ViText его не создаёт. До callback проверены заявленный MIME, ненулевой размер и максимум 5 000 000 байт; сервер проверяет реальные байты/доступ/лимиты.
Отмена и устаревший ответ
uploadImage(file, { signal?, alt? }) возвращает Promise
Приложение удаляет неиспользованный загруженный файл самостоятельно. Вставка файлов из drag/drop или clipboard в callback пока не подключена. Внешний URL может обращаться к стороннему серверу; CSP и доверенные домены определяет приложение.