标题基本上说明了自己。
我有一个VertX
的REST端点。碰到它时,我有一些逻辑可以生成一个AWS-S3
对象。
我以前的逻辑不是上传到S3
,而是将其保存在本地。因此,我可以在响应routerCxt.response().sendFile(file_path...)
上执行此操作。
现在该文件位于S3中,我必须在本地下载该文件,然后才能调用上述代码。
那是缓慢而低效的。我想将S3对象直接流传输到response
对象。
在Express
中,是这样的。 s3.getObject(params).createReadStream().pipe(res);
。
我读了一点,发现VertX
有一个叫做Pump
的类。但是示例中的vertx.fileSystem()
使用了它。
我不确定如何将InputStream
的{{1}}的{{1}}插入S3
以使用getObjectContent()
。
我什至不确定vertx.fileSystem()
是正确的方法,因为我试图使用Pump
返回本地文件,但是它没有用。
Pump
我有没有这样做的例子?
谢谢
答案 0 :(得分:4)
如果您使用Vert.x WebClient
而不是与Amazon Java Client进行S3通信,则可以完成此操作。
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。