2

我在使用 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,应该被认为是正常的。请注意,我可以通过固件门户 UI 正常下载请求的文件。

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

4

1 回答 1

3

当向对象存储服务器请求文件时,响应的正文直接是与所请求文件相关联的内容。在您的情况下,您的文件不直接包含图像。相反,它已使用 base64 编码并包装在包含附加元数据的 JSON 对象中。这种内容与 application/cdmi-object mimetype 相关联。对象存储用户和程序员指南中有使用它们的示例。

尽管您可以使用 WireCloud 中的那些“cdmi-object”文件,但它不提供任何创建或解析它们的支持(如果您需要通过问题跟踪器提供支持,您可以报告问题)。如果您最终想使用当前支持的功能使用这些文件,则需要使用 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 小部件和操作员在上传/下载存储在对象存储中的图像时利用了该支持,请查看问题报告小部件问题服务操作员代码。这消除了使用 base64 编码/解码文件的需要,使请求/响应有效负载更小,从而提高了性能。除此之外,您可以使用该方法创建 URL并直接从元素URL.createObjectURL加载这些图像 blob 。<img>

注意: CDMI 标准还支持检索最终内容,而无需从客户端处理 cdmi-object(请参阅完整规范的第 8.5.8 节),但它并未在 FI-WARE 中实现。

于 2014-06-26T23:21:38.870 回答