Создать PDF новый файл () из строки base64 - PullRequest
0 голосов
/ 04 апреля 2019

Я создаю приложение, которое загружает изображения в коллекцию 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);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...