从base64字符串创建PDF新File()

时间:2019-04-04 07:48:09

标签: javascript file sapui5

我正在制作一个使用InstantUpload = false将图像上传到UploadCollection(SAPUI5)的应用程序。在扩展过程开始之前,我已经扩展了UploadCollection控件来处理这些图像文件。在此重新定义中,我已使用“ jsPDF”库将所有这些图像合并为PDF。

以“标准”方式上载PDF文件时出现问题,这意味着使用UploadCollection的标准“ sendFiles”功能。此方法需要这些文件的类型为:“文件”。我有一个base64字符串。这意味着我需要使用“ new File()”构造函数。

使用这个base64字符串,我创建了一个Blob,并使用这个Blob创建了一个File。我实现了上传文件,但是当我尝试打开它时,该文件不可读。我认为文件的创建过程是错误的。

我遵循了一些教程,但无法解决我的问题。

我知道我可以在Ajax中上传Blob,但是由于公司的最佳做法,我不想使用Ajax,因为我需要使用ODataModel。

如果我将base64字符串解析为PDF文件,那么我可以看到PDF格式,所以问题不在于base64字符串生成。

如果使用Chrome,则可以生成文件,但可以看到name属性包含blob,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);

0 个答案:

没有答案
相关问题