我在 web 应用程序中使用 jclouds 1.6.1-incubating(使用 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 加载到内存中)。这会导致用户单击“下载”后 web 应用程序无响应。我希望云数据立即开始流式传输到浏览器(playframework 支持)。

当我只想获取元数据时,这种超时甚至更糟(我可能想获取许多文件的元数据,而无需将它们全部下载到 webapp)。

我对吗? BlobStore.getBlob(container,name) 在返回之前是否实际下载了文件?有没有另一种方法可以获得可以直接发送到浏览器的异步输入流?

最佳答案

您只能查询元数据:

BlobMetadata metadata = BlobStore.blobMetadata(container, name);
Long contentLength = metadata.getContentMetadata().getContentLength();
BlobStore.getBlob 启动下载但不下载整个 blob 数据。相反,它通过 Payload 或 InputStream 流式传输数据。它会阻塞,直到 blobstore 返回 blob 元数据。

请注意,您应该调用 Payload.close 以确保关闭底层套接字。

关于java - JClouds:BlobStore.getBlob() 需要很长时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18600755/

10-11 10:57