[英]Sending a file to vertx eventbus
我正在嘗試使用Vertx上傳文件,該請求是包含PDF的POST請求,我的處理程序看起來像這樣(我從github中的示例中獲取了代碼):
...
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,但目前尚不清楚如何在這種情況下應用它。
注意:在這種情況下必須使用事件總線。
當您使用http post將文件上傳到vertx時,該文件將存儲在文件系統中。
您必須在bodyhandler中設置上載目錄: http ://vertx.io/docs/apidocs/io/vertx/ext/web/handler/BodyHandler.html#setUploadsDirectory-java.lang.String-
FileUpload對象僅將元信息保存到fileupload,但不保存內容本身。
如果要通過事件總線發送文件,則必須首先從文件系統中讀取文件: http : //vertx.io/docs/apidocs/io/vertx/core/file/FileSystem.html#readFile-java.lang .String-io.vertx.core.Handler-
您可以為此使用緩沖區。
在路由中,您遍歷文件,讀取臨時文件並將其作為緩沖區發送:
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
}
});
}
然后接收頂點可能如下所示:
private static class ReceiverVerticle extends AbstractVerticle {
@Override
public void start() {
vertx.eventBus().consumer(Address.UPLOAD_FILE, new Handler<Message<Buffer>>() {
@Override
public void handle(Message<Buffer> event) {
System.out.println(event.body().toString());
event.reply("OK");
}
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.