Corda:我不能使用来自Web UI的二进制流来将pdf(文件)附加到Corda节点

时间:2017-10-17 03:06:49

标签: corda

我们正在尝试使用二进制流将pdf作为附件上传到corda事务。事实上,我们从这里得到了灵感(https://github.com/corda/corda/blob/release-M13.0/core/src/main/kotlin/net/corda/core/Utils.kt),看看有趣的sizesInputStreamAndHash()。还有其他建议吗?

以下是我们如何在API中编写二进制流的代码片段:

    logger.debug(numOfClearBytes)
    val baos = ByteArrayOutputStream()
    ZipOutputStream(baos).use({ zos ->
        val arraySize = numOfClearBytes.toByteArray().size
        val bytes = numOfClearBytes.toByteArray()
        val n = (numOfClearBytes.toByteArray().size - 1) / arraySize + 1 // same as Math.ceil(numOfExpectedBytes/arraySize).
        zos.setLevel(Deflater.BEST_COMPRESSION)
        zos.putNextEntry(ZipEntry("z"))
        for (i in 0 until n) {
            zos.write(bytes, 0, arraySize)
        }
        zos.closeEntry()
    })
    val bytes = baos.toByteArray()
    val inputAndHash: InputStreamAndHash = InputStreamAndHash(ByteArrayInputStream(bytes), bytes.sha256())

    val attachmentId = services.uploadAttachment(inputAndHash.inputStream)

    val flowHandle = services.startTrackedFlow(::Payer, exchangeAmount, otherParty, attachmentId)

    val attachmentId = services.uploadAttachment(inputAndHash.inputStream)

    val flowHandle = services.startTrackedFlow(::Payer, exchangeAmount, otherParty, attachmentId)

1 个答案:

答案 0 :(得分:0)

要使用内置网络服务器通过HTTP将附件上传到节点,您必须点击/upload/attachment端点。默认情况下,此端点由节点提供 - 您不必自己添加它。请参阅https://github.com/corda/corda/blob/release-V1/webserver/src/main/kotlin/net/corda/webserver/servlets/DataUploadServlet.kt

如果您向此端点发送附件,它将上传到该节点,端点将返回该节点上文件的散列。

然后,您可以使用CordaRPCOps.openAttachmentServiceHub.attachments.openAttachment将附件作为输入流使用其哈希检索。然后,您可以根据需要处理它(在Web端点或流程中)。

要查看使用HTTP端点上传附件的示例CorDapp,请参阅此处的黑名单示例:https://github.com/corda/samples(自述文件中的详细信息)。