Import Blockly project

1. Introduction

Import the Blockly project.

2. Request & Response

Name
Type
Required fields
Description

path

String

Yes

Path to upload to the Blockly folder

data

Json

Yes

Blockly information: {"type":"dir","name":"test_1","uuid":"/[D]test_1"}

File

Binary

Yes

Binary data of file

3. Code Example

background:

self.set_header("Access-Control-Allow-Origin", "*")
self.set_header("Access-Control-Allow-Headers", "x-requested-with")
self.set_header('Access-Control-Allow-Methods', 'POST')
path = self.request.arguments.get('path')[0].decode()

path = os.path.join(projects_path, path)
file_metas = self.request.files.get('file', None)  # 提取表单中'name'为'file'的文件元数据
if file_metas:
    success = 0
    for meta in file_metas:
        filename = meta['filename']

        if filename.endswith(('.gz', '.xml')):
            file_path = os.path.join(upload_temp_path, filename.strip())
            if not os.path.exists(upload_temp_path):
                os.makedirs(upload_temp_path)
            with open(file_path, 'wb') as up:
                up.write(meta['body'])
            if not os.path.getsize(file_path):
                return -3
            if filename.endswith('.gz'):
                name = filename.split('.')[0]
                if name.startswith('blockly-'):
                    name = name.split('blockly-')[-1]
                name = name if name else 'tmp'
                extract_path = os.path.join(upload_temp_path, name.strip())
                shutil.unpack_archive(file_path, extract_path, 'gztar')
                blockly_traj_path = os.path.join(extract_path, 'traj')
                if os.path.exists(blockly_traj_path):
                    yield GLOBAL.Core.command.xarm_upload_traj(
                        None, 0, {'path': extract_path, 'is_del_upload_path': False})

                return update_config(path, extract_path, select_data, name)
        else:
            if select_data and isinstance(select_data, dict):
                select_uuid = select_data.get('uuid')
                if select_uuid == '/[D]UF_APPS':
                    select_uuid = '/[D]USER_APPS'
            else:
                select_uuid = '/[D]USER_APPS'

            name = filename.split('.')[0]
            cnt = 0
            new_name = name
            if new_name.startswith('[UF]'):
                new_name = 'UF{}'.format(name[4:])
            while os.path.exists(os.path.join(path, new_name)):
                cnt += 1
                new_name = '{}_{}'.format(name, cnt)
            target_path = os.path.join(path, new_name)
            os.makedirs(target_path)
            shutil.copy(file_path, os.path.join(target_path, 'app.xml'))
            success += 1
            if not os.path.exists(os.path.join(target_path, '.app')):
                with open(os.path.join(target_path, '.app'), 'w', encoding='utf-8') as f:
                    json.dump({
                        'lastAccessTime': 0,
                        'deviceType': GLOBAL.XArm.xarm_type,
                    }, f, sort_keys=True, indent=4, skipkeys=True, separators=(',', ':'),
                        ensure_ascii=False)

            app_config_path = os.path.join(path, '.app_config')
            if os.path.exists(app_config_path):
                with open(app_config_path, 'r', encoding='utf-8') as f:
                    data = json.load(f)
                children = data.get('children', [])
                for child in children:
                    if child['type'] == 'dir' and child['uuid'] == select_uuid:
                        child['children'].append({
                            'uuid': '/' + new_name,
                            'name': new_name,
                            'type': 'file',
                            'children': [],
                        })
                        break

                with open(app_config_path, 'w', encoding='utf-8') as f:
                    json.dump(data, f, sort_keys=True, indent=4, skipkeys=True,
                              separators=(',', ':'), ensure_ascii=False)

        shutil.rmtree(upload_temp_path)
        os.makedirs(upload_temp_path)
    self.write(json.dumps({'result': 'ok', 'success': success}))
else:
    self.write(json.dumps({'result': 'Invalid Args', 'success': -2}))

front_end:

 <el-upload :disabled="isRunning" multiple class="app-uploader com-edit-btn" :data="uploadData" :action="`http://${window.GlobalUtil.socketInfo.host}/project/upload`"
                    :show-file-list="false" :on-success="handleUploadProjectSuccess" :before-upload="beforeUploadProject">
                    <img :disabled="isRunning" @click="onUpload" src="../assets/img/blockly/upload-icon2.svg" />
                  </el-upload>

Last updated