2017-10-17 3 views
1

바이너리 스트리밍을 사용하여 corda 트랜잭션에 대한 첨부 파일로 pdf를 업로드하려고합니다. 사실 우리는 여기서 영감을 얻었습니다 (https://github.com/corda/corda/blob/release-M13.0/core/src/main/kotlin/net/corda/core/Utils.kt) 재미있는 sizeInputStreamAndHash()를 확인하십시오. 우리가 시도 할 수있는 다른 제안이 있습니까?Corda : 웹 UI에서 이진 스트리밍을 사용하여 Corda 노드에 pdf (파일)를 첨부 할 수 없습니다.

다음은 우리가 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) 
+0

그리고 무엇이 잘못 되었습니까? 오류 메시지가 있었습니까? – joel

+0

Howdy Joel! 그다지 Corda의 문제에 관한 것이 아니라, 나는 웹 API를 작동시키기 위해 사용할 라이브러리를 추측한다. 우리 프로젝트에 'org.glassfish.jersey.media 가져 오기'를 사용했고 코드가 웹 서버를 시작할 때 MultiPartFeature.class를 등록하지 않아 오류가 발생했습니다. 그것없이 MediaType.MULTIPART_FORM_DATA의 API에서 @FormDataParam을 사용할 수 없습니다 –

답변

0

는 HTTP를 통해 노드에 첨부 파일을 업로드하려면, 당신은 /upload/attachment 엔드 포인트를 공격해야합니다. 이 엔드 포인트는 기본적으로 노드가 제공하므로 직접 추가하지 않아도됩니다. https://github.com/corda/corda/blob/release-V1/webserver/src/main/kotlin/net/corda/webserver/servlets/DataUploadServlet.kt을 참조하십시오.

첨부 파일을이 끝점으로 보내면 노드에 업로드되고 끝점은 노드의 파일 해시를 반환합니다.

그런 다음 해시를 사용하여 첨부 파일을 입력 스트림으로 검색하려면 CordaRPCOps.openAttachment 또는 ServiceHub.attachments.openAttachment을 사용할 수 있습니다. 그런 다음 웹 엔드 포인트 또는 플로우에서 적합한 것으로 처리 할 수 ​​있습니다.

다음은 첨부 파일을 업로드하기 위해 HTTP 끝점을 사용하는 CorDapp의 예입니다 (readme의 세부 정보) https://github.com/joeldudleyr3/blacklist.

+0

Howdy Joel! 나는 코드를보고있다. 이/업로드/첨부 파일 종점은 어디에 있습니까? jar/zip 파일의 해시로 명확하게 응답하므로 스크립트가 실행 중입니까? –

+0

웹 서버를 통해 파일을 만들어야하기 때문에 같은 Tx에 첨부하기 전에 정보를 파싱 할 수 있습니다. 현재 우리는 실제 계약의 텍스트 파일과 pdf 파일을 가지고 있습니다. 우리가 구문 분석 할 수있는 텍스트와 api에서 tx에 넣기 전에 압축하십시오. 그러나 우리는 API에서 텍스트와 함께 압축하기 위해 Pdf를 얻는 것에 매달려 있습니다. 어쨌든 나는 더 많은 것을 시도 할 수 있는지 살펴볼 것입니다. –

+0

위 내 대답을 업데이트했습니다. – joel

관련 문제