我需要使用vertx编写上传文件代码,然后将其保存到PostgreSQL表中。但是当文件以多部分和异步方式上传时,我无法获得字节完整的数组。以下是我的代码
public static void uploadLogo(RoutingContext routingContext) {
HttpServerRequest request = routingContext.request();
HttpServerResponse response = routingContext.response();
request.setExpectMultipart(true);
request.uploadHandler(upload -> {
upload.handler(chunk -> {
byte[] fileBytes = chunk.getBytes();
});
upload.endHandler(endHandler -> {
System.out.println("uploaded successfully");
});
upload.exceptionHandler(cause -> {
request.response().setChunked(true).end("Upload failed");
});
});
}
这里我在fileBytes
中得到字节数组,但一次只能得到一部分。我不明白如何向它添加下一个字节数组,因为它异步工作。有没有办法获取整个文件的字节数组
答案 0 :(得分:1)
请求上下文有.fileUploads()
方法。
请参阅此处以获取完整示例:https://github.com/vert-x3/vertx-examples/blob/master/web-examples/src/main/java/io/vertx/example/web/upload/Server.java#L42
如果您想访问上传的文件:
Vertx vertx = Vertx.vertx();
Router router = Router.router(vertx);
router.post("/upload").handler(ctx -> {
for (FileUpload fu : ctx.fileUploads()) {
vertx.fileSystem().readFile(fu.uploadedFileName(), fileHandler -> {
// Do something with buffer
});
}
});
答案 1 :(得分:1)
您好我可以使用以下代码提取字节:
router.post("/upload").handler(ctx->{
ctx.request().setExpectMultipart(true);
ctx.request().bodyHandler(buffer->{
byte[] bytes=buffer.getBytes();
//transfer bytes to whichever service you want from here
});
ctx.response().end();
});
答案 2 :(得分:0)
获取上传文件后,必须使用fileUploads()
方法获取字节数组。
JsonArray attachments = new JsonArray();
for (FileUpload f : routingContext.fileUploads()) {
Buffer fileUploaded = routingContext.vertx().fileSystem().readFileBlocking(f.uploadedFileName());
attachments.add(new JsonObject().put("body",fileUploaded.getBytes()).put("contentType",f.contentType())
.put("fileName",f.fileName()));
}
答案 3 :(得分:0)
您需要通过将upload.handler
中的传入部件附加到Buffer中来手动构建它。调用upload.endHandler
后,上传过程结束,您可以获取结果缓冲区及其字节数组。
request.uploadHandler(upload -> {
Buffer cache = null;
upload.handler(chunk -> {
if (cache == null) {
cache = chunk;
} else {
cache.appendBuffer(chunk);
}
});
upload.endHandler(end -> {
byte[] result = cache.get().getBytes();
});
});