Загрузить 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 ответ:
При запросе файлов на сервер хранения объектов телом ответа является непосредственно содержимое, связанное с запрошенным файлом. В вашем случае файл не содержит непосредственно изображения. Вместо этого он был закодирован с помощью 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 из полные спецификации), но это не реализовано в интернет-изделий.