2017-05-17 1 views
0

J'essaye de télécharger un fichier en utilisant Vertx, la requête est une requête POST qui contient un PDF, mon gestionnaire ressemble à ceci (j'ai pris le code d'un exemple dans github):Envoyer un fichier à vertx eventbus

... 
Set<FileUpload> fileUploadSet = routingContext.fileUploads(); 
Iterator<FileUpload> fileUploadIterator = fileUploadSet.iterator(); 
while (fileUploadIterator.hasNext()) { 
    FileUpload fileUpload = fileUploadIterator.next(); 

    // Use the Event Bus to dispatch the file now 
    // Since Event Bus does not support POJOs by default so we need to create a MessageCodec implementation 
    // and provide methods for encode and decode the bytes 
    ... 

    vertx.eventBus().<"what to use here?">send(Address.UPLOAD_FILE, "", result -> { 
     if (result.succeeded()) { 
      req.response() 
       .setStatusCode(200) 
       .write(result.result().body()) 
       .end(); 
     } else { 
      logger.info(result.cause().toString()); 
      req.response() 
       .setStatusCode(500) 
       .write(result.cause().toString()) 
       .end(); 
     } 
    }); 

Selon le commentaire ci-dessus, je ne peux pas juste essayer quelque chose comme ça (il montre en fait une erreur):

vertx.eventBus().<FileUpload>send(Address.UPLOAD_FILE, "", result -> { 

J'ai vérifiais MessageCodec mais ce n'est pas clair pour moi comment l'appliquer pour ce cas.

Note: l'utilisation du bus d'événement est un must pour cet escenario.

Répondre

1

Lorsque vous téléchargez un fichier vers Vertx avec un message http, le fichier est stocké dans le système de fichiers.

Vous devez définir le répertoire uploads dans votre bodyHandler: http://vertx.io/docs/apidocs/io/vertx/ext/web/handler/BodyHandler.html#setUploadsDirectory-java.lang.String-

L'objet FileUpload ne détient que les méta-informations au fileupload, mais pas le contenu lui-même.

Si vous voulez envoyer le fichier sur le EventBus, vous devez lire d'abord du système de fichiers: http://vertx.io/docs/apidocs/io/vertx/core/file/FileSystem.html#readFile-java.lang.String-io.vertx.core.Handler-

0

Vous pouvez utiliser buffers pour cela.
Dans votre itinéraire que vous itérer sur les fichiers, lire le fichier temporaire et l'envoyer comme tampon:

for (FileUpload fileUpload : routingContext.fileUploads()) { 
    vertx.fileSystem().readFile(fileUpload.uploadedFileName(), (f) -> { 
     if (f.succeeded()) { 
      vertx.eventBus().send(Address.UPLOAD_FILE, f.result()); 
      // Also handle response here 
     } 
    }); 
} 

recevant ensuite verticle peut ressembler à ceci:

private static class ReceiverVerticle extends AbstractVerticle { 

    @Override 
    public void start() { 
     vertx.eventBus().consumer("file", new Handler<Message<Buffer>>() { 

      @Override 
      public void handle(Message<Buffer> event) { 
       System.out.println(event.body().toString()); 

       event.reply("OK"); 
      } 
     }); 
    } 
}