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
,而是本地保存。因此,我可以在responserouterxt.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论坛上发布一个完整的复制器。。我想出来了。。这是一个新手犯的错误,非常重要。谢谢你的帮助,谢谢你的提醒!