我正在使用jclouds 1.6.1在网络应用程序中进行孵化(使用scala playframework 2.1.3,但这无关紧要)。
由于jclouds中接收blob的所有其他方法似乎都已弃用,我想使用
BlobStore.getBlob(container,name).getPayload().getInput()
获取存储数据的输入流。我想将这些数据流传输到浏览器,而不必将整个blob存储在服务器上。
有时我只想获得一些像
这样的元数据BlobStore.getBlob(container,name).getMetadata().getContentMetadata().getContentLength()
然而,呼吁
BlobStore.getBlob(container,name)
需要很长时间才能返回(我假设它将blob加载到内存中)。这会导致用户点击“下载”后webapp无响应。我希望云数据立即开始流式传输到浏览器(playframework支持)。
当我只想获取元数据时,这种超时更加糟糕(我可能希望获取许多文件的元数据,而无需将所有文件下载到webapp)。
我是对的吗? BlobStore.getBlob(容器,名称)实际上是在返回之前下载文件的吗?有没有其他方法可以获得我可以直接发送到浏览器的异步输入流?
答案 0 :(得分:4)
您只能通过以下方式查询元数据:
BlobMetadata metadata = BlobStore.blobMetadata(container, name);
Long contentLength = metadata.getContentMetadata().getContentLength();
BlobStore.getBlob
启动下载但不下载整个blob数据。相反,它通过Payload或InputStream流式传输数据。它会阻塞,直到blobstore返回blob元数据。
请注意,您应该调用Payload.close以确保关闭底层套接字。