Вопрос или проблема
У меня есть этот метод в моем контроллере в Business Applications Studio SAPUI5, но он не работает так, как я ожидал (я хочу, чтобы файл был прикреплен к счет-фактуре с предоставленным Objectkey, что работает идеально с второй функцией, но при выполнении первой функции файл загружается и отправляется на сервер, но я не могу его открыть (подробная информация ниже)). Я не получаю никаких сообщений об ошибках при выполнении первой функции, процесс загрузки успешен, я просто не могу открыть файл позже.
onFileSelected: function (oEvent) {
var oFile = oEvent.getParameter("files")[0];
if (oFile) {
var reader = new FileReader();
reader.onload = function (e) {
var binaryContent = e.target.result;
var oModel = this.getView().getModel();
oModel.refreshSecurityToken(function (data, response) {
var sToken = response.headers['x-csrf-token'];
var sObjectKey = "Placeholder";
var sObjectType = "BUS2081";
var sFileName = oFile.name;
var sSlug = btoa(sFileName);
var sContentType = oFile.type;
// Двоичный контент как полезная нагрузка
var oPayload = binaryContent;
oModel.create("/OriginalContentSet", oPayload, {
headers: {
"x-csrf-token": sToken,
"Slug": sSlug,
"Objectkey": sObjectKey,
"Objecttype": sObjectType,
},
success: function (data) {
MessageToast.show("Успех");
},
error: function (oError) {
MessageToast.show("Ошибка");
}
});
}.bind(this), function () {
MessageToast.show("Ошибка с CSRF токеном");
});
}.bind(this);
reader.readAsArrayBuffer(oFile); // Чтение файла как двоичного массива (без кодирования Base64)
} else {
MessageToast.show("Файл не выбран");
}
}
Я на 100% уверен, что такие переменные, как Slug, Contenttype, token и т. д. правильные (я заменил некоторые переменные на Placeholder, но это не имеет значения, я сделал это только для этого вопроса из соображений конфиденциальности). У меня также есть другой метод, который работает идеально, но в этом методе я использовал Ajax вместо oModel.create. Теперь я хочу сделать то же самое, но с oModel.create, но это не работает. Файл загружается правильно, но при попытке его открыть мне говорят, что этот файл не может быть открыт и что “Он может быть поврежден или в формáте, который Просмотр не распознает.” … Я не получаю ошибки во время процесса загрузки (иногда я получаю “нет обработчика для данных”, но я только получил это, когда пробовал разные решения… с предоставленным кодом я не получаю никаких ошибок). Я хочу, чтобы файл был прикреплен к счет-фактуре с предоставленным Objectkey, что работает с обоими методами, но только метод Ajax также позволяет мне открыть файл после его загрузки. Вот работающий метод с Ajax для сравнения:
onFileSelected: function (oEvent) {
var oFile = oEvent.getParameter("files")[0];
if (oFile) {
var reader = new FileReader();
reader.onload = function (e) {
var binaryContent = e.target.result;
var oModel = this.getView().getModel();
oModel.refreshSecurityToken(function (data, response) {
var sToken = response.headers['x-csrf-token'];
var sObjectKey = "Placeholder";
var sObjectType = "BUS2081";
var sFileName = oFile.name;
var sSlug = btoa(sFileName);
var sContentType = oFile.type;
$.ajax({
url: "placeholder/OriginalContentSet",
type: "POST",
data: binaryContent,
processData: false,
contentType: sContentType,
headers: {
"x-csrf-token": sToken,
"Slug": sSlug,
"Objectkey": sObjectKey,
"Objecttype": sObjectType
},
success: function (data) {
MessageToast.show("Успех");
},
error: function (oError) {
MessageToast.show("Ошибка");
}
});
}.bind(this), function () {
MessageToast.show("Ошибка.");
});
}.bind(this);
reader.readAsArrayBuffer(oFile); // Чтение файла как двоичного массива (без кодирования Base64)
} else {
MessageToast.show("Файл не выбран");
}
}
Я попытался немного изменить код, например, создав объект полезной нагрузки с именем файла и типом контента, а не просто сохраняя двоичный контент в переменной полезной нагрузки, а также переместив переменные из объекта полезной нагрузки в заголовок и наоборот, но результат всегда один и тот же.
Ответ или решение
Использование метода oModel.create()
в SAP UI5 может быть сложной задачей, особенно когда речь идет о загрузке файлов в формате, который будет корректно обрабатываться сервером. В вашем случае, несмотря на успешную загрузку файла, возникает проблема с его открытием. Давайте разберемся более подробно, как правильно использовать метод `oModel.create() и что может вызвать проблему.
Введение в метод oModel.create()
Метод oModel.create()
используется для создания новой сущности на сервере. Он принимает следующие основные параметры:
- sPath: Путь к набору данных на сервере, в который будет отправлен запрос.
- oPayload: Данные, которые необходимо отправить на сервер. В вашем случае это бинарное содержимое файла.
- oContext: Опциональный контекст, содержащий дополнительные параметры, такие как заголовки и функции обратного вызова.
Анализ вашего кода
Проблема с загрузкой файлов
В вашем коде вы правильно производите чтение файла с помощью объекта FileReader
и извлекаете бинарное содержимое. Несмотря на это, возникает проблема при отправке данных. В отличие от вашего метода, использующего jQuery Ajax, вы передаете бинарное содержимое напрямую в oModel.create()
, что, скорее всего, является основной причиной проблемы.
-
Формат отправляемых данных: Для правильной работы с бинарными данными вам может потребоваться использовать специальные форматы или методы сериализации. Убедитесь, что ваш сервер ожидает именно тот формат, который вы отправляете.
-
Неверный заголовок контента: В большинстве случаев заголовок
Content-Type
должен быть установлен правильно для бинарных данных. Он должен соответствовать типу файла, который вы загружаете (например,application/pdf
для PDF-файлов).
Корректировка кода
Для решения обнаруженной проблемы, попробуйте изменить способ передачи бинарного содержимого:
onFileSelected: function (oEvent) {
var oFile = oEvent.getParameter("files")[0];
if (oFile) {
var reader = new FileReader();
reader.onload = function (e) {
var binaryContent = e.target.result;
var oModel = this.getView().getModel();
oModel.refreshSecurityToken(function (data, response) {
var sToken = response.headers['x-csrf-token'];
var sObjectKey = "Placeholder";
var sObjectType = "BUS2081";
var sFileName = oFile.name;
var sSlug = btoa(sFileName);
var sContentType = oFile.type;
// Создаем объект с необходимыми данными
var oPayload = {
FileContent: binaryContent,
FileName: sFileName,
ContentType: sContentType
};
oModel.create("/OriginalContentSet", oPayload, {
headers: {
"x-csrf-token": sToken,
"Slug": sSlug,
"Objectkey": sObjectKey,
"Objecttype": sObjectType,
"Content-Type": sContentType // Убедитесь, что заголовок установлен
},
success: function (data) {
MessageToast.show("Success");
},
error: function (oError) {
MessageToast.show("Error");
}
});
}.bind(this), function () {
MessageToast.show("Error with the CSRF Token");
});
}.bind(this);
reader.readAsArrayBuffer(oFile);
} else {
MessageToast.show("No file selected");
}
}
Заключение
Используя вышеуказанные рекомендации, вы сможете улучшить свою работу с методом oModel.create()
в SAP UI5. Основное внимание следует уделить формату передаваемых данных и корректной настройке заголовков.
Убедитесь, что сервер ожидает именно такой формат, который вы ему отправляете, и продолжайте проверять логи для выявления любых неполадок. Надеюсь, это поможет вам решить проблему с открытием загруженных файлов.