我的后端代码与此question非常相似。
Router router = Router.router(vertx);
router.route().handler(BodyHandler.create().setDeleteUploadedFilesOnEnd(true));
router.route("/api/*")
.produces(Constants.JSON_CONTENT_TYPE)
.failureHandler(rc -> {
// handling failure code
});
router.post("/api/upload").handler(uploadHandler::uploadHandler);
vertx.createHttpServer(httpOptions)
.requestHandler(router::accept) // The router::accept, method passes all routes defined in Router.
.listen(// do things);
class UploadHandler() {
void uploadHandler(RoutingContext context) {
uploads.forEach(// do things);
}
}
我一直在使用 postman 来测试这些方法。它工作得很好。
在 postman 中,我选择 POST ,无标题,表单数据作为正文,然后选择< strong>文件而不是文本上传文件。
我在服务器中检查了 postman 自动包含内容类型。
我认为这是一个很好的方法。如果有更好的方法,请告诉我。
我的问题是单元测试。 我使用了与此类似的代码。 https://github.com/vert-x/vertx-examples/blob/master/src/raw/java/upload/UploadClient.java
还有其他类似的内容。但服务器一直说没有附加文件。
将文件发送到服务器的好方法是什么?
答案 0 :(得分:0)
您问题中的链接指向旧版本的Vert.x
使用最新版本,您应该使用Vert.x Web客户端。
String filename = "upload.txt";
FileSystem fs = vertx.fileSystem();
WebClient client = WebClient.create(vertx);
fs.props(filename, ares -> {
FileProps props = ares.result();
System.out.println("props is " + props);
long size = props.size();
HttpRequest<Buffer> req = client.put(8080, "localhost", "/");
req.putHeader("content-length", "" + size);
fs.open(filename, new OpenOptions(), ares2 -> {
req.sendStream(ares2.result(), ar -> {
if (ar.succeeded()) {
HttpResponse<Buffer> response = ar.result();
System.out.println("Got HTTP response with status " + response.statusCode());
} else {
ar.cause().printStackTrace();
}
});
});
});
有关完整的客户端/服务器示例,请查看Vert.x examples repository