...

Загрузка файлов в ELMA365 через WebAPI

Тема в разделе "Примеры сценариев", создана пользователем ava_var, 17 май 2022.

Метки:
  1. ava_var

    ava_var Member

    В данной статье я хочу показать пример загрузки файла через Web API и его дальнейшее использование в системе.

    Разделим нашу операцию на 2 шага - загрузить файл в 365 и создать приложение с этим файлом.

    Для начала подготовим серверные сценарии.
    Операции с fetch-запросами вынес в серверные сценарии, чтоб избежать проблемы CORS

    Метод для загрузки файла
    Код:
    
    async function uploadFile(): Promise<void> {
        
    let resultData 'upload start';
        try {
            const 
    jsonany Context.data.json;
            const 
    formdata = new FormData();
            const 
    arrBuffer await (await fetch(json.fileSourceUrl)).arrayBuffer();
            
    formdata.append('file'arrBufferjson.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',
                
    headersheaders,
                
    bodyformdata
            
    })

            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 
    jsonany 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',
                
    headersheaders,
                
    bodyJSON.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 
    Math.random() * 16 0== 'x' : (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",
            
    fileSourceUrlContext.data.fileurl,
            
    fileNameContext.data.filename,
            
    hashawait uuidv4()
        }
        
    Server.rpc.uploadFile();
    }


    async function attach(): Promise<void> {
        
    Context.data.test "create doc...";
        
    Server.rpc.attachFile();
    }
    Контекст выглядит следующим образом
    upload_2022-5-17_23-58-38.png