3

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

当我只想获取元数据时,这个超时会更糟(我可能想要获取许多文件的元数据而不将它们全部下载到 webapp)。

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

4

1 回答 1

4

您只能使用以下方式查询元数据:

BlobMetadata metadata = BlobStore.blobMetadata(container, name);
Long contentLength = metadata.getContentMetadata().getContentLength();

BlobStore.getBlob启动下载但不下载整个 blob 数据。相反,它通过 Payload 或 InputStream 流式传输数据。它会一直阻塞,直到 blobstore 返回 blob 元数据。

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

于 2013-09-20T17:32:17.617 回答