File upload vertx上传文件的正确方法

File upload vertx上传文件的正确方法,file-upload,vert.x,File Upload,Vert.x,我在这里创建了2台服务器 Router router = Router.router(vertx); router.route().handler(BodyHandler.create()); router.post("/api/upload").handler(routingContext -> { System.out.println(routingContext.fileUploads().size()); routingCon

我在这里创建了2台服务器

    Router router = Router.router(vertx);
    router.route().handler(BodyHandler.create());
    router.post("/api/upload").handler(routingContext -> {
        System.out.println(routingContext.fileUploads().size());
        routingContext.response().end();
    });
    vertx.createHttpServer().requestHandler(req -> {
        router.accept(req);
    }).listen(8080, listenResult -> {
        if (listenResult.failed()) {
            System.out.println("Could not start HTTP server");
            listenResult.cause().printStackTrace();
        } else {
            System.out.println("Server started");
        }
    });
    // ==========================================
    vertx.createHttpServer().requestHandler(req -> {
        req.bodyHandler(buff -> {
            System.out.println(buff.toString() + " from client");
            req.response().end();
        });
    }).listen(8081, listenResult -> {
        if (listenResult.failed()) {
            System.out.println("Could not start HTTP server");
            listenResult.cause().printStackTrace();
        } else {
            System.out.println("Server started");
        }
    });
第一个来自vertx

第二个是从

当与邮递员一起测试时,两者都有效

当使用其他前端代码进行测试时(例如:),只有第二台服务器工作

这就是我在上面的github示例中更新的内容

fetch(`http://localhost:8081/api/upload`, {
  method: 'POST',
  headers: {

  },
  body: body,
})
.then(res => {
  console.log('response status: ', res.statusText);
  return res.json();
})
.then(res => console.log(res))
.catch(err => {
  console.log("An error occurred");
  console.error(err);
});
实际上,我更喜欢使用第一服务器的方法

因为两者都是由Postman测试的,所以我认为服务器不是问题,需要在客户端进行调整

有人能指出我应该向客户添加什么吗

谢谢

编辑

axios.post('http://localhost:50123/api/upload', fileData)
        .then(response => {
            console.log('got response');
            console.dir(response);
        })
        .catch(err => {
            console.log("Error occurred");
            console.dir(err);
        });
axios
在从前端传递文件时工作

现在的问题是使用
vertxweb客户端进行单元测试

fs.open("content.txt", new OpenOptions(), fileRes -> {
  if (fileRes.succeeded()) {
    ReadStream<Buffer> fileStream = fileRes.result();

    String fileLen = "1024";

    // Send the file to the server using POST
    client
      .post(8080, "myserver.mycompany.com", "/some-uri")
      .putHeader("content-length", fileLen)
      .sendStream(fileStream, ar -> {
        if (ar.succeeded()) {
          // Ok
        }
      });
  }
});

我看不出你的最后一个例子能起什么作用。您发布到
http://localhost:8080/upload
,但您的路线是
/api/upload
。在第二个示例中,使用port
8081
时,您只需忽略路由,并假设您收到的任何内容都是文件上载。这是第二个示例“有效”的唯一原因。

我必须说,使用编辑来更改问题的内容是非常令人困惑的。到底什么是不起作用的?客户端代码?你的测试代码?是的,我明白。我试图使用评论,但我的编辑太长了。当前,如果服务器是使用
路由设置的,则使用
VertX
WebClient.sendStream
无法工作。这是用来测试的。谢谢。我打错了。它是/api/upload。自从我创建了几个示例并从中复制以来,路径和端口变得越来越混乱。但我的问题仍然是
WebClient.sendStream
在使用
routes
    CloseableHttpClient httpClient = HttpClients.createDefault();
    HttpPost uploadFile = new HttpPost("http://localhost:8080/upload");
    MultipartEntityBuilder builder = MultipartEntityBuilder.create();
    builder.addTextBody("field1", "yes", ContentType.TEXT_PLAIN);

// This attaches the file to the POST:
        File f = new File("./test.txt");
    builder.addBinaryBody(
            "file",
            new FileInputStream(f),
            ContentType.APPLICATION_OCTET_STREAM,
            f.getName()
    );

    HttpEntity multipart = builder.build();
    uploadFile.setEntity(multipart);
    CloseableHttpResponse response = httpClient.execute(uploadFile);
    HttpEntity responseEntity = response.getEntity();
    System.out.println(responseEntity.toString());