在vertx中上传文件并将其转换为字节数组以插入数据库中

时间:2017-09-17 08:12:26

标签: java file-upload httprequest vert.x

我需要使用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中得到字节数组,但一次只能得到一部分。我不明白如何向它添加下一个字节数组,因为它异步工作。有没有办法获取整个文件的字节数组

4 个答案:

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