从fiware对象存储下载blob

时间:2014-06-26 16:53:33

标签: fiware fiware-wirecloud

我在使用ObjectStorageAPI管理FIWARE对象存储中的文件时遇到问题。 编写了一组创建图像并将其上传到对象存储的小部件/操作符之后,我希望能够在任何给定的实例下载这些文件。但是,似乎我无法这样做。

经过身份验证后,我列出了容器内容,然后,我尝试下载全局变量file_name指定的我需要的文件,如下所示:

function onGetAuthTokenSuccess(new_token, data){
    ...
    api = new ObjectStorageAPI(object_storage);
    api.listContainer(container, {
        token: token,
        onSuccess: onListContainterSuccess,
        onFailure: function () {
            alert("Could not find container " + container + " in region " + region);
        }
    });
}

function onListContainterSuccess(file_list) {
    api.getFile(container, file_name, {
        token: token,
        onSuccess: onDownloadFileSuccess,
        onFailure: function () {
            alert("Could not successfully download " + file_name);
        }
    });
}

function onDownloadFileSuccess(blob){
    console.log(JSON.stringify(blob));
    ....
}

运行上面的代码会产生如下输出:

 {"type":"image/png","size":45590}

没有提供任何其他信息。

与此同时,我的浏览器网络监视器建议事务实际上正确发生,因为(未格式化和收缩)响应有效负载是:

{"mimetype":"image/png","metadata":{},"valuetransferencoding":"base64","value":"iVBORw0KGgoAAAANSUhEUgAAA0MAAAE2CAYAAACjsEm0AAAgAElEQVR4Xux9CZgU1dX26Z5935kZlmGTRTZl00iMS4iExEQ0RI2JCyayCAqCGCIiYlBj0KhgDEKQfMQvGvJnUYwmBv0kMQaMISoo+47sMiyzz3RP.....m1YaNpGAAAAABJRU5ErkJggg=="}

HTTP状态为200或304,应视为正常。 请注意,我可以通过fiware门户网站UI正常下载所请求的文件。

关于如何以正确的方式实际获取文件的任何想法?

1 个答案:

答案 0 :(得分:3)

当向对象存储服务器请求文件时,响应的主体直接是与所请求文件相关联的内容。在您的情况下,您的文件不直接包含图像。相反,它已使用base64进行编码,并包含在包含其他元数据的JSON对象中。这种内容与application / cdmi-object mimetype相关联。在Object Storage user and programmers guide中有一些使用它们的例子。

虽然你可以利用那些" cdmi-object"来自WireCloud的文件,它不会为创建或解析它们提供任何支持(如果您需要通过issue tracker提供支持,则会打开报告问题)。如果您最终想要使用当前支持的功能使用这些文件,则需要使用response_type选项来指示您要将文件作为文本下载(而不是将文件作为blob下载)并且能够解析JSON内容然后解码图像:

api.getFile(container, file_name, {
    token: token,
    response_type: "text",
    onSuccess: function (data) {
        var cdmi_object = JSON.parse(data);
        var image = your_code_for_decoding_base64(cdmi_object.data);
        ...
    },
    onFailure: function () {
        alert("Could not successfully download " + file_name);
    }
});

无论如何,Object Storage GE能够存储二进制内容(blob)。实际上,FI-WARE Live Demo小部件和操作员在上传/下载存储在对象存储中的图像时会使用该支持,请查看issue-reporter widgetissue service operator代码。这消除了使用base64编码/解码文件的需要,使请求/响应有效载荷更小,从而提高了性能。除此之外,您还可以使用URL.createObjectURL方法创建网址,并直接从<img>元素加载这些图片blob。

注意: CDMI标准还支持检索最终内容,而无需从客户端处理cdmi-object(参见full spec的第8.5.8节),但它是&#39;未在FI-WARE中实施。