将S3对象流式传输到VertX Http Server响应

时间:2018-08-03 01:25:51

标签: amazon-s3 stream vert.x

标题基本上说明了自己。

我有一个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

我有没有这样做的例子?

谢谢

1 个答案:

答案 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