2017-05-17 106 views
0

我想用Vertx上傳文件,請求是包含PDF的POST請求,我的處理程序看起來像這樣(我從github中的示例代碼):發送文件到vertx事件總線

... 
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(); 
     } 
    }); 

根據上述評論,我不能只是嘗試這樣的事情(它實際上顯示錯誤):

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

我一直在檢查MessageCodec但它不是我清楚如何應用它對於這種情況。

注:事件總線的使用是這個情景的必要條件。

回答

1

當您使用http post將文件上傳到vertx時,該文件將存儲在文件系統中。

您必須設置上傳目錄在bodyhandler:http://vertx.io/docs/apidocs/io/vertx/ext/web/handler/BodyHandler.html#setUploadsDirectory-java.lang.String-

FileUpload對象僅持有元信息的文件上傳,而不是內容本身。

如果你想發送文件在eventbus,你必須從文件系統中第一次讀到它:http://vertx.io/docs/apidocs/io/vertx/core/file/FileSystem.html#readFile-java.lang.String-io.vertx.core.Handler-

0

您可以使用緩衝器,用於這一點。
在你的路線,你遍歷文件,讀取臨時文件,並把它作爲緩衝:

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 
     } 
    }); 
} 

然後接收verticle可能看起來像這樣:

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"); 
      } 
     }); 
    } 
}