使用 ZipEntry 复制附件异常 Corda
Duplicate Attachment Exception Corda Using a ZipEntry
我知道在 Corda 上作为附件上传的每个文件都会生成一个唯一的哈希值,这些文件将被转换为 zip/jar 格式,因为这些是 Corda 支持将它们保存为附件的类型.我遇到过一个场景,我在同一个节点上两次上传同一个文件,但有时间间隔,这导致它有两个附件哈希,这是可以理解的,因为我先将这个文件压缩为 zip,然后再上传。但是当我尝试同时上传同一个文件两次时,就会出现 DuplicateAttachmentException。我试过调试,我发现,当我们压缩文件时,它们在同一时间压缩,因此在 Corda 看来,这些压缩是相同的。如果我将多个文件的压缩过程延迟 1 秒左右,则不会发生此异常。有解决办法吗?
private fun uploader(inputStream: InputStream, fileName: String, uploader: String): AttachmentId {
val zipName = "$fileName.zip"
FileOutputStream(zipName).use { fileOutputStream ->
ZipOutputStream(fileOutputStream).use { zipOutputStream ->
val zipEntry = ZipEntry(fileName)
zipOutputStream.putNextEntry(zipEntry)
inputStream.copyTo(zipOutputStream, 1024)
}
}
return FileInputStream(zipName).use { fileInputStream ->
val hash = proxy.uploadAttachmentWithMetadata(
jar = fileInputStream,
uploader = uploader,
filename = fileName
)
Files.deleteIfExists(Paths.get(zipName))
hash
}
}
这是我用来产生问题的代码。
我不认为这是可以避免的例外情况。如果哈希值相同,那么 Corda 很可能会抛出它。
我很好奇您需要多次上传同一附件的用例是什么,我怀疑您在设计中避免该问题比创建解决方法更容易对于 corda.
我想您也可以在上传文件的过程中稍微修改一下文件,以确保它们在上传时略有不同。
您可以在 corda 中找到检查重复附件的实际代码:https://github.com/corda/corda/blob/82a114a329fee1a249f9c0786d5c2f8593759863/node/src/main/kotlin/net/corda/node/services/persistence/NodeAttachmentService.kt#L435
我知道在 Corda 上作为附件上传的每个文件都会生成一个唯一的哈希值,这些文件将被转换为 zip/jar 格式,因为这些是 Corda 支持将它们保存为附件的类型.我遇到过一个场景,我在同一个节点上两次上传同一个文件,但有时间间隔,这导致它有两个附件哈希,这是可以理解的,因为我先将这个文件压缩为 zip,然后再上传。但是当我尝试同时上传同一个文件两次时,就会出现 DuplicateAttachmentException。我试过调试,我发现,当我们压缩文件时,它们在同一时间压缩,因此在 Corda 看来,这些压缩是相同的。如果我将多个文件的压缩过程延迟 1 秒左右,则不会发生此异常。有解决办法吗?
private fun uploader(inputStream: InputStream, fileName: String, uploader: String): AttachmentId {
val zipName = "$fileName.zip"
FileOutputStream(zipName).use { fileOutputStream ->
ZipOutputStream(fileOutputStream).use { zipOutputStream ->
val zipEntry = ZipEntry(fileName)
zipOutputStream.putNextEntry(zipEntry)
inputStream.copyTo(zipOutputStream, 1024)
}
}
return FileInputStream(zipName).use { fileInputStream ->
val hash = proxy.uploadAttachmentWithMetadata(
jar = fileInputStream,
uploader = uploader,
filename = fileName
)
Files.deleteIfExists(Paths.get(zipName))
hash
}
}
这是我用来产生问题的代码。
我不认为这是可以避免的例外情况。如果哈希值相同,那么 Corda 很可能会抛出它。
我很好奇您需要多次上传同一附件的用例是什么,我怀疑您在设计中避免该问题比创建解决方法更容易对于 corda.
我想您也可以在上传文件的过程中稍微修改一下文件,以确保它们在上传时略有不同。
您可以在 corda 中找到检查重复附件的实际代码:https://github.com/corda/corda/blob/82a114a329fee1a249f9c0786d5c2f8593759863/node/src/main/kotlin/net/corda/node/services/persistence/NodeAttachmentService.kt#L435