...

Работа с файлами

Тема в разделе "Примеры сценариев", создана пользователем ELMA365, 1 дек 2021.

  1. ELMA365

    ELMA365 Moderator

    Для работы с файлами в ELMA365 доступны три метода. Они позволяют создавать файлы в контексте бизнес-процессов, а также получать ссылку на скачивание существующего файла. Это удобно, например, при настройке интеграции с внешними сервисами, когда необходимо загрузить файл в систему.

    1) create() - метод описания поля типа Файл, создает файл в контексте процесса;

    2) createFromLink() - метод описания поля типа Файл, создает файл в контексте процесса из ссылки на файл во внешнем источнике;

    3) getDownloadUrl() - метод объекта типа Файл, генерирует ссылку для скачивания файла.

    Разберем примеры их использования.


    create
    Предположим, что нам нужно получить файл из внешней системы с помощью HTTP запроса и записать его в контекстную переменную процесса.

    Создадим простой бизнес-процесс из двух шагов — задача пользователя и сценарий. В задаче разместим два поля: Название файла (name) с типом Строка и Ссылка на файл (link) с типом Ссылка. В контекст процесса также добавим поле типа Файл, чтобы в него записать полученный файл.

    [​IMG]

    В блоке сценарий используем функцию:

    Код:
    
    async function createFile(): Promise {
    // Загружаем файл по ссылке
    const fileRq await fetch(`${ Context.data.link }`);
    // Преобразуем тело файла в объект с бинарными данными
    const buf await fileRq.arrayBuffer();
    // Создаем файл и записываем его в контекстную переменную
    Context.data.file await Context.fields.file.create(`${ Context.data.name }`, buf);
    }
    Обратите внимание, что в имя файла, передаваемое в метод create, следует включать расширение для корректного скачивания.

    Запустим процесс в режиме отладки.

    [​IMG]

    После выполнения задачи и сценария, в контексте процесса появится созданный файл.

    [​IMG]


    createFromLink
    Если не требуется дополнительных сложных обработок, с помощью данного метода можно гораздо проще создать файл по ссылке, так как он принимает ссылку в качестве одного из параметров. Таким образом, мы можем переработать код из первого примера, и получить следующую функцию:

    Код:
    
    async function createFile(): Promise {
    Context.data.file await Context.fields.file.createFromLink(`${ Context.data.name }`, `${ Context.data.link }`)
    }
    getDownloadUrl
    С помощью этого метода можно получить ссылку для скачивания файла в ELMA365 и, например, отправить ее в стороннюю систему. Рассмотрим пример отправки письма со ссылкой на электронную почту.

    В примере будем использовать бизнес-процесс со сценарием и вебхуком:

    [​IMG]

    В контексте процесса создадим переменные Ссылка (link), Электронная почта (email) и Файл (file). Последние две добавим на форму стартового события.

    [​IMG]

    Для блока Сценарий напишем функцию:

    Код:
    
    async function downloadUrl(): Promise {
    Context.data.link await Context.data.file!.getDownloadUrl();
    }
    С помощью вебхука будем передавать адрес электронной почты и ссылку на скачивание файла в стороннюю систему, которая затем сформирует HTML-тело письма и отправит его на указанный адрес.

    [​IMG]

    [​IMG]

    Таким образом, с помощью данных методов можно как получать файлы из сторонних систем, так и передавать файлы из ELMA365 .
  2. zaitsev_i

    zaitsev_i Активный участник

    Судя по документации, ссылка "живет" 1 час. Не очень хорошая идея встраивать ее в электронной письмо. Отправив такое вечером, пользователь не сможет ее скачать утро https://tssdk.elma365.com/ru/interfaces/_01_items_.fileitem.html#getdownloadurl
  3. gagra33332

    gagra33332 Участник

    Добрый день.
    Как сделать, чтобы ссылка жила больше часа или суток?
  4. zaitsev_i

    zaitsev_i Активный участник

    по API получайте свежую ссылку в момент, когда она требуется. "вечной" ссылки нет.
  5. tolkachev

    tolkachev Новичок

    [​IMG]
    Беру первый метод


    const fileRq = await fetch(`${Context.data.zapros_ssylka}`);
    const buf = await fileRq.arrayBuffer();
    Context.data.fail = await Context.fields.fail.create(`${Context.data.nazvanie_faila}`, buf);

    Используя данный метод я получаю правильного размера файл, но по какой-то причине его начинка не фетчится, даже если я беру большие файлы, в итоге получаю такой