2017-10-17 4 views
1

Nous essayons de télécharger un pdf en pièce jointe à la transaction corda en utilisant le streaming binaire. en fait nous avons eu notre inspiration d'ici (https://github.com/corda/corda/blob/release-M13.0/core/src/main/kotlin/net/corda/core/Utils.kt) jetez un coup d'œil à sizeInputStreamAndHash(). Y a-t-il d'autres suggestions que nous pourrions essayer?Corda: Je ne peux pas utiliser le streaming binaire de l'interface web pour attacher un pdf (fichier) au noeud Corda

Ce qui suit est un extrait de la façon dont nous avons écrit pour le streaming binaire dans l'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

Et qu'est-ce qui a mal tourné? Y avait-il un message d'erreur? – joel

+0

Howdy Joel! Ce n'est pas tellement sur le problème de Corda, mais je suppose que la bibliothèque à utiliser pour faire fonctionner l'API web. Nous avons utilisé 'import org.glassfish.jersey.media' dans notre projet et nous avons eu une erreur à cause du fait que corda n'a pas enregistré MultiPartFeature.class quand il a démarré le serveur web. Sans cela, nous ne pouvons pas utiliser @FormDataParam dans l'API pour MediaType.MULTIPART_FORM_DATA –

Répondre

0

Pour télécharger une pièce jointe au nœud via HTTP, vous devez frapper le point final /upload/attachment. Ce noeud final est fourni par le noeud par défaut - vous n'avez pas besoin de l'ajouter vous-même. Voir https://github.com/corda/corda/blob/release-V1/webserver/src/main/kotlin/net/corda/webserver/servlets/DataUploadServlet.kt.

Si vous envoyez une pièce jointe à ce noeud final, il sera téléchargé sur le noeud et le point de terminaison renverra le hachage du fichier sur le noeud.

Vous pouvez ensuite utiliser CordaRPCOps.openAttachment ou ServiceHub.attachments.openAttachment pour récupérer la pièce jointe en tant que flux d'entrée à l'aide de son hachage. Vous pouvez ensuite le traiter comme bon vous semble (dans un point de terminaison Web ou dans un flux).

Voici un exemple CorDapp qui utilise un point de terminaison HTTP pour télécharger une pièce jointe: https://github.com/joeldudleyr3/blacklist (détails dans le fichier Readme).

+0

Howdy Joel! Je regarde le code. Où se trouve ce point de terminaison/upload/attachment? Y at-il un script en cours d'exécution car il répond clairement avec un hachage du fichier jar/zip. –

+0

Nous avons besoin que le fichier soit fait via le serveur web, donc nous pouvons analyser les informations avant de les mettre en pièce jointe dans le même Tx. Actuellement, nous avons un fichier texte et un fichier pdf du contrat actuel. Le texte que nous pouvons analyser, et compresser avant de mettre dans le tx à l'API. Cependant, nous sommes en quelque sorte coincés à obtenir le Pdf à compresser avec du texte à l'API. En tout cas je vais jeter un oeil pour voir ce que nous pouvons essayer de plus. –

+0

Mis à jour ma réponse ci-dessus. – joel