使用 Java 和 vert.x 在 POST 请求中获取图像
Getting image in POST request using Java and vert.x
我遇到以下问题,我无法获取从 android 应用程序发送到服务器的图像,我使用 kotlin 从应用程序发送图像,并在使用 Java 使用 vert.x.
我用以下代码发送:
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()
在服务器端,我的处理方式类似于
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}");
});
}
但是我无法将任何内容放入 imageByte 变量中。
您需要在所有路由前添加BodyHandler
Router baseRouter = Router.router(vertx);
baseRouter.route().handler(BodyHandler.create());
更多信息在这里https://vertx.io/preview/docs/apidocs/io/vertx/ext/web/handler/BodyHandler.html
我遇到以下问题,我无法获取从 android 应用程序发送到服务器的图像,我使用 kotlin 从应用程序发送图像,并在使用 Java 使用 vert.x.
我用以下代码发送:
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()
在服务器端,我的处理方式类似于
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}");
});
}
但是我无法将任何内容放入 imageByte 变量中。
您需要在所有路由前添加BodyHandler
Router baseRouter = Router.router(vertx);
baseRouter.route().handler(BodyHandler.create());
更多信息在这里https://vertx.io/preview/docs/apidocs/io/vertx/ext/web/handler/BodyHandler.html