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

#fiware #fiware-wirecloud

#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.

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

Ответ №1:

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

Хотя вы можете использовать эти файлы «cdmi-object» из WireCloud, он не предоставляет никакой поддержки для их создания или синтаксического анализа (вы можете сообщить о проблеме, если вам нужна такая поддержка, через средство отслеживания проблем). Если вы, наконец, хотите использовать эти файлы с использованием текущих поддерживаемых функций, вам нужно будет использовать параметр 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 способно хранить двоичное содержимое (большие двоичные объекты). Фактически, виджеты FI-WARE Live Demo и operator используют эту поддержку при загрузке / загрузке изображений, хранящихся в хранилище объектов, взгляните на виджет «Отчет о проблемах» и коды оператора службы выдачи. Это устраняет необходимость кодирования / декодирования файлов с использованием base64, уменьшает полезную нагрузку запросов / ответов и, следовательно, повышает производительность. В дополнение к этому вы можете создавать URL-адреса с помощью URL.createObjectURL метода и загружать эти большие двоичные объекты изображения непосредственно из <img> elements.

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