将 S3 object 流式传输到 VertX Http 服务器响应
Streaming S3 object to VertX Http Server Response
标题基本上说明了一切。
我有一个 VertX
的 REST 端点。击中它后,我有一些逻辑会导致 AWS-S3
object。
我之前的逻辑不是上传到S3
,而是保存在本地。所以,我可以在响应 routerCxt.response().sendFile(file_path...)
处执行此操作。
既然文件在S3中,我必须先下载到本地才能调用上面的代码。
那是缓慢且低效的。我想将 S3 object 直接流式传输到 response
object。
在Express
中是这样的。 s3.getObject(params).createReadStream().pipe(res);
。
我看了一点,看到VertX
有个class叫Pump
。但它在示例中被 vertx.fileSystem()
使用。
我不确定如何将 InputStream
从 S3
的 getObjectContent()
插入 vertx.fileSystem()
以使用 Pump
。
我什至不确定 Pump
是正确的方法,因为我尝试使用 Pump
到 return 本地文件,但它没有用。
router.get("/api/test_download").handler(rc -> {
rc.response().setChunked(true).endHandler(endHandlr -> rc.response().end());
vertx.fileSystem().open("/Users/EmptyFiles/empty.json", new OpenOptions(), ares -> {
AsyncFile file = ares.result();
Pump pump = Pump.pump(file, rc.response());
pump.start();
});
});
有什么例子可以让我这样做吗?
谢谢
如果您使用 Vert.x WebClient
与 S3 通信而不是 Amazon Java 客户端,则可以做到。
WebClient
可以将内容通过管道传输到 HTTP 服务器响应:
webClient = WebClient.create(vertx, new WebClientOptions().setDefaultHost("s3-us-west-2.amazonaws.com"));
router.get("/api/test_download").handler(rc -> {
HttpServerResponse response = rc.response();
response.setChunked(true);
webClient.get("/my_bucket/test_download")
.as(BodyCodec.pipe(response))
.send(ar -> {
if (ar.failed()) {
rc.fail(ar.cause());
} else {
// Nothing to do the content has been sent to the client and response.end() called
}
});
});
诀窍是使用 pipe
body codec.
标题基本上说明了一切。
我有一个 VertX
的 REST 端点。击中它后,我有一些逻辑会导致 AWS-S3
object。
我之前的逻辑不是上传到S3
,而是保存在本地。所以,我可以在响应 routerCxt.response().sendFile(file_path...)
处执行此操作。
既然文件在S3中,我必须先下载到本地才能调用上面的代码。
那是缓慢且低效的。我想将 S3 object 直接流式传输到 response
object。
在Express
中是这样的。 s3.getObject(params).createReadStream().pipe(res);
。
我看了一点,看到VertX
有个class叫Pump
。但它在示例中被 vertx.fileSystem()
使用。
我不确定如何将 InputStream
从 S3
的 getObjectContent()
插入 vertx.fileSystem()
以使用 Pump
。
我什至不确定 Pump
是正确的方法,因为我尝试使用 Pump
到 return 本地文件,但它没有用。
router.get("/api/test_download").handler(rc -> {
rc.response().setChunked(true).endHandler(endHandlr -> rc.response().end());
vertx.fileSystem().open("/Users/EmptyFiles/empty.json", new OpenOptions(), ares -> {
AsyncFile file = ares.result();
Pump pump = Pump.pump(file, rc.response());
pump.start();
});
});
有什么例子可以让我这样做吗?
谢谢
如果您使用 Vert.x WebClient
与 S3 通信而不是 Amazon Java 客户端,则可以做到。
WebClient
可以将内容通过管道传输到 HTTP 服务器响应:
webClient = WebClient.create(vertx, new WebClientOptions().setDefaultHost("s3-us-west-2.amazonaws.com"));
router.get("/api/test_download").handler(rc -> {
HttpServerResponse response = rc.response();
response.setChunked(true);
webClient.get("/my_bucket/test_download")
.as(BodyCodec.pipe(response))
.send(ar -> {
if (ar.failed()) {
rc.fail(ar.cause());
} else {
// Nothing to do the content has been sent to the client and response.end() called
}
});
});
诀窍是使用 pipe
body codec.