File upload vertx上传文件的正确方法
我在这里创建了2台服务器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
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
。在第二个示例中,使用port8081
时,您只需忽略路由,并假设您收到的任何内容都是文件上载。这是第二个示例“有效”的唯一原因。我必须说,使用编辑来更改问题的内容是非常令人困惑的。到底什么是不起作用的?客户端代码?你的测试代码?是的,我明白。我试图使用评论,但我的编辑太长了。当前,如果服务器是使用路由设置的,则使用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());