Загрузить blob-объект из хранилища объектов fiware


У меня возникли проблемы с использованием 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 интерфейс портала.

Есть идеи о том, как я должен действовать, чтобы действительно получить файл правильным образом?

1 2

1 ответ:

При запросе файлов на сервер хранения объектов телом ответа является непосредственно содержимое, связанное с запрошенным файлом. В вашем случае файл не содержит непосредственно изображения. Вместо этого он был закодирован с помощью base64 и завернут в объект JSON, содержащий дополнительные метаданные. Такого рода контент, связанный с приложением/cdmi очень просто-объект тип. Примеры их использования приведены в руководствеObject Storage user and programmers guide .

Хотя вы можете использовать эти файлы "cdmi-object" из WireCloud, он не предоставляет никакой поддержки для их создания или разбора (вы можете сообщить о проблеме, если вам нужна эта поддержка через issue tracker ). Если Вы, наконец, хотите использовать эти файлы, используя текущие поддерживаемые функции, вам нужно будет использовать опцию response_type для указания, что вы хотите загрузить файл в виде текста( вместо загрузки файла в виде большого двоичного объекта) и иметь возможность анализировать содержимое 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);
    }
});

В любом случае, хранилище объектов GE способно хранить двоичное содержимое (Blob-объекты). На самом деле, виджеты и оператор FI-WARE Live Demo используют эту поддержку при загрузке/загрузке изображений, хранящихся в хранилище объектов, обратите внимание на виджет issue-reporter и коды оператора issue service. Это устраняет необходимость кодирования / декодирования файлов с помощью base64, уменьшает полезную нагрузку запросов и ответов и, следовательно, повышает производительность. В кроме того, вы можете создавать URL-адреса с помощью метода URL.createObjectURL и загружать эти изображения непосредственно из элементов <img>.

Примечание: в cdmi очень просто стандарт также поддерживает извлечение готового контента, без необходимости обработки cdmi очень просто-объект от клиента (см. раздел 8.5.8 из полные спецификации), но это не реализовано в интернет-изделий.