Я создаю приложение, которое загружает изображения в коллекцию UploadCollection (SAPUI5) с InstantUpload = false. Я расширил элемент управления UploadCollection для обработки этих файлов изображений перед началом процесса загрузки. В этом переопределении я объединил все эти изображения в PDF, используя библиотеку "jsPDF".
Проблема возникает при загрузке PDF-файла «стандартным» способом, то есть с использованием стандартной функции «sendFiles» в UploadCollection. Этот метод требует, чтобы эти файлы имели тип: «Файл». У меня есть строка base64. Это означает, что мне нужно использовать конструктор "new File ()".
С помощью этой строки base64 я создал большой двоичный объект, а с помощью этого большого двоичного объекта - файл. Я достигаю загрузки файла, но когда я пытаюсь открыть его, файл не читается. Я считаю, что процесс создания файла является неправильным.
Я следовал нескольким учебникам и не смог решить свою проблему.
Я знаю, что в Ajax я могу загрузить большой двоичный объект, но я не хочу использовать Ajax, поскольку мне нужно использовать ODataModel из-за лучших практик моей компании.
Если я проанализирую строку base64 в файле PDF, я смогу увидеть файл PDF правильно, поэтому проблема не в генерации строки base64.
Если я использую Chrome, генерация файла работает, но я вижу, что свойство name содержит большой двоичный объект, а localURL содержит имя, как если бы в параметрах был несоответствующий элемент. Например, если Chrome не следует этому API: https://www.w3.org/TR/FileAPI/#dfn-file
Если я использую Firefox, свойства верны, но при загрузке файла возникает та же проблема. Файл не может быть отображен.
Я перепробовал так много вещей, что не могу перечислить их все здесь.
/**
* Function that converts string to blob
* @param {String} sBase64Data String with the base64 info
* @param {String} sContentType mimeType of the data: application/pdf
* @returns {Blob} Blob for the new File()
*/
_b64toBlob: function (sBase64Data, sContentType) {
var aByteCharacters = atob(sBase64Data);
var aByteArrays = [];
var iSliceSize = 512;
// var iSliceSize = 1;
for (var offset = 0; offset < aByteCharacters.length; offset += iSliceSize) {
var slice = aByteCharacters.slice(offset, offset + iSliceSize);
var aByteNumbers = new Array(slice.length);
for (var i = 0; i < slice.length; i++) {
aByteNumbers[i] = slice.charCodeAt(i);
}
var aByteArray = new Uint8Array(aByteNumbers);
aByteArrays.push(aByteArray);
}
var blob = new Blob(aByteArrays, {
type: sContentType
});
return blob;
},
//In other part of the code....
var sContentType = "application/pdf";
var sPDFBase64 = btoa(doc.output());
var oBlob = this._b64toBlob(sPDFBase64, sContentType);
var fFile = new File([oBlob], sFileName, { type: sContentType });
aFiles.push(fFile);
this._sendFilesWithXHR(aFiles);