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