Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 将S3对象流式传输到Vertex Http服务器响应_Amazon S3_Stream_Vert.x - Fatal编程技术网

Amazon s3 将S3对象流式传输到Vertex Http服务器响应

Amazon s3 将S3对象流式传输到Vertex Http服务器响应,amazon-s3,stream,vert.x,Amazon S3,Stream,Vert.x,标题基本上解释了自己 我有一个带有VertX的REST端点。点击它时,我有一些逻辑,它会生成一个AWS-S3对象 我以前的逻辑不是上传到S3,而是本地保存。因此,我可以在responserouterxt.response().sendFile(文件路径…中执行此操作 既然文件在S3中,我必须在本地下载它,然后才能调用上面的代码 这是缓慢和低效的。我想将S3对象直接流式传输到响应对象 在Express中,是这样的s3.getObject(params.createReadStream().pipe

标题基本上解释了自己

我有一个带有
VertX
的REST端点。点击它时,我有一些逻辑,它会生成一个
AWS-S3
对象

我以前的逻辑不是上传到
S3
,而是本地保存。因此,我可以在response
routerxt.response().sendFile(文件路径…
中执行此操作

既然文件在S3中,我必须在本地下载它,然后才能调用上面的代码

这是缓慢和低效的。我想将S3对象直接流式传输到
响应
对象

Express
中,是这样的<代码>s3.getObject(params.createReadStream().pipe(res)

我读了一点,发现
VertX
有一个名为
Pump
的类。但是在示例中,
vertx.fileSystem()
使用它

我不知道如何将
S3
getObjectContent()
中的
InputStream
插入
vertx.fileSystem()
以使用
Pump

我甚至不确定
Pump
是否正确,因为我试图使用
Pump
返回一个本地文件,但没有成功

    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
    }
  });
});

诀窍是使用
管道

谢谢。这让我朝着正确的方向迈出了一步。是否有任何标题需要添加到
响应
标题
?当我没有添加任何额外的
时,它不会下载,当我添加
内容类型:二进制/八位字节流
时,它会下载一个空白文件。我事先测试了临时url,它确实下载了它。所以,这可能不是一个原因。似乎是另一个问题。最好在Vert.x论坛上发布一个完整的复制器。。我想出来了。。这是一个新手犯的错误,非常重要。谢谢你的帮助,谢谢你的提醒!