将 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() 使用。

我不确定如何将 InputStreamS3getObjectContent() 插入 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.