В данной статье я хочу показать пример загрузки файла через Web API и его дальнейшее использование в системе.
Разделим нашу операцию на 2 шага - загрузить файл в 365 и создать приложение с этим файлом.
Для начала подготовим серверные сценарии. 
Операции с fetch-запросами вынес в серверные сценарии, чтоб избежать проблемы CORS
Метод для загрузки файла
	Код:
	
async function uploadFile(): Promise<void> {
    let resultData = 'upload start';
    try {
        const json: any = Context.data.json;
        const formdata = new FormData();
        const arrBuffer = await (await fetch(json.fileSourceUrl)).arrayBuffer();
        formdata.append('file', arrBuffer, json.fileName);
        const headers = {
            'Authorization': `Bearer ${json.token}`,
            "Content-Range": `bytes 0-${arrBuffer.byteLength}/${arrBuffer.byteLength}`
        }
        const resp = await fetch(`https://${json.hostname}/pub/v1/disk/directory/${json.direcoryId}/upload?hash=${json.hash}`, {
            method: 'POST',
            headers: headers,
            body: formdata
        })
        if (!resp.ok) {
            // обработка ответа с ошибкой
            resultData = `${resp.status} ${resp.statusText} ${await resp.text()} `
        }
        else {
            // обработка успешного ответа
            const response = await resp.json()
            if (response && response.success && response.file) {
               // если файл создался - сохраняем его идентификатор в контекстную переменную
                Context.data.fileuid = response.file.__id;
                resultData = Context.data.fileuid!;
            }
        }
    } catch (err) {
        resultData = `err: ${err.message}`
    }
    Context.data.test = resultData;
}
 После успешной заливки файла - можно приступать к созданию экземпляра приложения. Будем создавать экземпляр через стандартное API.
Метод для создания экземпляра приложения (Приложение doc в Разделе lowcode_education)
	Код:
	
async function attachFile(): Promise<void> {
    let resultData = 'attach';
    try {
        const json: any = Context.data.json;
        const headers = {
            'Authorization': `Bearer ${json.token}`,
        }
        const resp = await fetch(`https://${json.hostname}/pub/v1/app/lowcode_education/doc/create`, {
            method: 'POST',
            headers: headers,
            body: JSON.stringify(
                {
                    "context": {
                        "__externalProcessMeta": "undefined",
                        "__externalId": "example",
                        "__file": [Context.data.fileuid]
                    },
                    "withEventForceCreate": true
                }
            )
        })
        if (!resp.ok) {
            // обработка ответа с ошибкой
            resultData = `${resp.status} ${resp.statusText} ${await resp.text()} `
        }
        else {
            // обработка успешного ответа
            resultData = await resp.text()
        }
    } catch (err) {
        resultData = `err: ${err.message}`
    }
    Context.data.test = resultData;
}
 Теперь перейдем к реализации клиентских сценариев
	Код:
	
// сгенерировать uid
async function uuidv4(): Promise<string> {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    });
}
async function download(): Promise<void> {
    Context.data.test = "download file and upload 365 ...";
    Context.data.json = {
        token: "6baaad8a-614f-453c-9a3d-09359111aa22",
        hostname: "varankin_dev.elma365.ru",
        direcoryId: "8c110182-b022-5f31-ac3d-292fdc2d5fe4",
        fileSourceUrl: Context.data.fileurl,
        fileName: Context.data.filename,
        hash: await uuidv4()
    }
    Server.rpc.uploadFile();
}
async function attach(): Promise<void> {
    Context.data.test = "create doc...";
    Server.rpc.attachFile();
}
 Контекст выглядит следующим образом
	