Документация Engee

Запуск скачивания из бэкенда

Запустите скачивание файла после завершения процесса, создавшего его.

module App
using GenieFramework
@genietools

@app begin
    @out linkhref = "/data.txt"
    @in dfile = false
    @onbutton dfile begin
        # выполняем обработку и запись в файл
        write("./public/data.zip", string(randn(10)))
        sleep(2)
        # Изменяем URL-адрес ссылки для запуска скрипта скачивания файла. URL-адрес по-прежнему будет указывать на
        # тот же файл, но ссылка href будет иметь другую привязку после символа #
        linkhref = "/data.zip#($(rand(1)))"
    end
end

# Определяем скрипт, который будет отслеживать атрибут href в ссылке и переходить по ссылке при его изменении.
# Этот блок @mounted будет запускаться при загрузке страницы в браузере. Скрипт активируется
# с задержкой в ​​2 секунды, чтобы ссылка сначала отобразилась в браузере
@mounted """
    setTimeout(() => {
        var linkToWatch = document.getElementById('dynamicLink');
        if (!linkToWatch) {
            console.error('Link element not found');
            return;
        }

        var observer = new MutationObserver(function(mutations) {
            mutations.forEach(function(mutation) {
                if (mutation.type === 'attributes' && mutation.attributeName === 'href') {
                    console.log('Href changed to:', linkToWatch.href);
                    linkToWatch.click();
                }
            });
        });

        observer.observe(linkToWatch, { attributes: true });
    }, 2000); // Delay in milliseconds
"""

ui() = [
    # "dynamicLink" — это идентификатор ссылки, отслеживаемой скриптом
    # var":href" задается так, чтобы значение атрибута href бралось из реактивной переменной
    a(id="dynamicLink", var":href"="linkhref", "Dynamic Link"),
    btn("Download", @click(:dfile), loading=:dfile)
]

@page("/", ui)

up()
end