В данной статье я хочу показать пример загрузки файла через 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();
}
Контекст выглядит следующим образом