简体   繁体   English

使用 Java 和 vert.x 在 POST 请求中获取图像

[英]Getting image in POST request using Java and vert.x

I got the following question, I can't get image which I'm sending from android app to server, I'm sending image from app using kotlin, and receiving it on server written with Java using vert.x.我收到以下问题,我无法获取从 android 应用程序发送到服务器的图像,我正在使用 kotlin 从应用程序发送图像,并在使用 ZD52387880E1EA22817A72D3759213 编写的服务器上接收它

I send it with following code:我用以下代码发送它:

val serverUrl = "http://192.168.56.1:8080/recognize/get_text_from_image"

    val client = OkHttpClient.Builder()
        .build()

    val stream = ByteArrayOutputStream()
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream)
    val byteArray = stream.toByteArray()
    val encodedImage: String = encodeToString(byteArray, DEFAULT)

    val requestBody: RequestBody = RequestBody.create(MediaType.parse("image/*jpg"), encodedImage)

    val request: Request = Request.Builder()
        .url(serverUrl)
        .post(requestBody)
        .build()

on server side I'm handling it like在服务器端我正在处理它

    Router baseRouter = Router.router(vertx);
        Router apiRouter = Router.router(vertx);

        baseRouter.mountSubRouter("/recognize", apiRouter);

        vertx.createHttpServer()
                .requestHandler(baseRouter::accept)
                .listen(8080, result -> {
                    if (result.succeeded()) {
                        System.out.println("completed");
                        startFuture.complete();
                    } else {
                        startFuture.fail(result.cause());
                        System.out.println(result.cause().getLocalizedMessage());
                    }
                });

        apiRouter.route(HttpMethod.POST, "/get_text_from_image").handler(rc -> {

            BufferedImage bufferedImage = null;
            byte[] imageByte;
            try {
                BASE64Decoder decoder = new BASE64Decoder();
                imageByte = decoder.decodeBuffer(rc.getBodyAsString());
                ByteArrayInputStream bis = new ByteArrayInputStream(imageByte);
                bufferedImage = ImageIO.read(bis);
                bis.close();
                System.out.println("Decoding bytes to image");
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("Error while decoding bytes to image");
            }
            File outputfile = new File("/home/user/image.jpg");
            try {
                ImageIO.write(bufferedImage, "jpg", outputfile);
                System.out.println("Saving image");
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("Error while saving image");
            }

            JsonObject json = rc.getBodyAsJson();
            System.out.println(json.getString("id"));
            HttpServerResponse response = rc.response();
            response.putHeader("content-type", "application/json");

            // Write to the response and end it
            response.end("{\"status\": 200}");
        });
}

But I can't get anything into imageByte variable.但是我无法将任何内容放入 imageByte 变量中。

You need to add BodyHandler before all routes您需要在所有路线之前添加 BodyHandler

Router baseRouter = Router.router(vertx);
baseRouter.route().handler(BodyHandler.create());

more info here https://vertx.io/preview/docs/apidocs/io/vertx/ext/web/handler/BodyHandler.html更多信息在这里https://vertx.io/preview/docs/apidocs/io/vertx/ext/web/handler/BodyHandler.html

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM