【问题标题】:attaching binary file to an event in cumulocity将二进制文件附加到累积性事件
【发布时间】:2022-02-10 21:00:18
【问题描述】:

我有一个场景,在我的代码中创建了一个文件和一个累积事件。我需要将二进制文件附加到事件中,但是 API 都没有为我提供功能,请指导如何继续?


更新:

在查看文档 https://cumulocity.com/api/10.11.0/#tag/Attachments 时,binaryElement 具有以下结构

我已通过以下方式修改了我的 JAVA 代码:

String pathEvent = platform.getUrl().get()+"/event/events/{{eventId}}/binaries";
    String pathEventAttachment = pathEvent.replace("{{eventId}}", event.getId().getValue());
    
    HttpHeaders headers = RequestAuthenticationEncoder.encode(getCredentials());
    headers.setContentType(MediaType.MULTIPART_FORM_DATA);
    MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
    map.add("file",new ByteArrayResource(FileUtils.readFileToByteArray(file)));//anychanges here fails the code
    map.add("filename", file.getName().getBytes());

    HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(map,headers);
    restTemplate.postForObject(pathEventAttachment, request, String.class);
    log.info("Binary file added to the event {}", event.getId().getValue());

为事件创建了二进制文件,但文件名不正确:

请告诉我一些关于为什么名称没有改变的见解?

【问题讨论】:

    标签: java cumulocity


    【解决方案1】:

    您需要使用适当的 Content-Type 和正文在 /event/events/{{eventId}}/binaries 上创建一个 POST。

    这是 python 中的代码 sn-p,其中二进制(日志文件)附加到事件。它只是将文件内容(字节)作为 application/octet-stream

    # Create event
    logfileEvent = {
        'type': 'c8y_Logfile',
        'text': 'See attached logfile',
        'time': datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
        'source': {
            'id': DEVICE_ID
        }
    }
    res = client.post(C8Y_BASE + '/event/events/', data=json.dumps(logfileEvent))
    eventId = res.json()['id']
    
    # Attach Binary
    res = client.post(C8Y_BASE + '/event/events/' + eventId + '/binaries', data=bytes(FILE_CONTENT, 'utf-8'), headers={'Content-Type': 'application/octet-stream'})
    binaryRef = res.json()['self']
    
    # Update operation
    logfileFragment = logfileOperation['c8y_LogfileRequest']
    logfileFragment['file'] = binaryRef
    updatedOperation = {
        'status': 'SUCCESSFUL',
        'c8y_LogfileRequest': logfileFragment
    }
    client.put(C8Y_BASE + '/devicecontrol/operations/' + logfileOperation['id'], data=json.dumps(updatedOperation))
    

    【讨论】:

    • 您能否查看更新并提供一些见解
    • 我不确定 Java 中的正确方法,但一般来说,HTTP 请求需要有一个标头“Content-Disposition”,其值为“filename=myfile.txt”
    猜你喜欢
    • 1970-01-01
    • 2020-10-07
    • 2011-12-11
    • 2017-05-12
    • 2011-10-13
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多