从ajaxResponse下载docx文件

时间:2018-11-19 09:59:24

标签: javascript ajax sapui5

因此,我尝试下载docx文档作为报告。通过将ajax响应转换为blob,然后转换为url!结果是显示信息的文档单词,“很抱歉,我们无法打开,因为我们发现它的内容有问题。 那里主要:     onDownloadReport:函数(oEvent){

var oAjaxBody = {
    SessionId: this.getModel("sessionModel").getData().SessionId,
    CustomerName: encodeURIComponent(this.getModel("sessionModel").getData().CustomerName.split("\n")[0]),
    TenantInfo: encodeURIComponent(this.getModel("sessionModel").getData().TenantInfo)
        };
var sServiceUrl = "/SDC_XS_TEMP/APPL/SDC/services/serviceRuntime/xsjs/SDC_REPORT_GENERATE_MM.xsjs";

var me = this;
$.ajax({
    url: sServiceUrl,
    type: "POST",
    responseType:'arraybuffer',
    contentType: "application/json",
    data: JSON.stringify(oAjaxBody),
    // dataType: "json",
    success: function (oAjaxResponse) {
        var content = oAjaxResponse;
        var fileName = 'rapport.docx'; // You can use the .txt extension if you want
        me.downloadwithpost(fileName, content);
    },
    error: function (oError) {
        console.log("failure");
    }

});

这是函数

downloadwithpost: function (filename, content) {
    var link = document.createElement('a');        
    var bytes = new Array(content.length);
    // var bytes = new Array(content.length);
    for (var i = 0; i < content.length; i++) {
        bytes[i] = content.charCodeAt(i);
    }
    var byteArray = new Uint8Array(bytes);
    var blob = new Blob([byteArray], {
        type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"                   
    });
    var url = URL.createObjectURL(blob);
    var oItem = {
        documentId: url,
        fileName: "rapport.docx",
        thumbnailUrl: "",
        url: url,
        selected: true
    };
    var oUploadCollection = this.getView().byId("uploadCollection");
    var newItem = new sap.m.UploadCollectionItem(oItem);
    oUploadCollection.addItem(newItem);
    oUploadCollection.downloadItem(newItem, true);
}

2 个答案:

答案 0 :(得分:0)

function downloadDoc(filename, sServiceUrl, oAjaxBody){
    var xhr = new XMLHttpRequest();
    xhr.open('POST', sServiceUrl, true);
    xhr.responseType = 'blob';
    xhr.send(JSON.stringify(oAjaxBody));   
    xhr.onreadystatechange = function(){
        if (xhr.readyState == 4){
            //$.unblockUI();
            if(xhr.status == 200) {
                var blob = new Blob([xhr.response], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
                if (navigator.msSaveOrOpenBlob)
                    navigator.msSaveOrOpenBlob(blob, filename);
                else {
                    var link = document.createElement('a');                     
                    var URL = window.URL || window.webkitURL;
                    var downloadUrl = URL.createObjectURL(blob);
                    link.href = downloadUrl;
                    link.style = "display: none";
                    link.download = filename;
                    document.body.appendChild(link);
                    link.click();
                    setTimeout(function(){
                        document.body.removeChild(link);
                        window.URL.revokeObjectURL(downloadUrl);  
                    }, 100);
                }
            }
            else {
                console.log("failure");
            }
        }            
    }
}

答案 1 :(得分:0)

看看这个例子,我使用的是十六进制数据格式,但是您可以根据需要进行更改。如果您需要有关此示例的帮助或有任何疑问,请告诉我。

   doAfterSuccess: function(result, fileName, fileType) {       
            var filedata = result.ARRAY[0].FILEDATA; // get data from response
            // ------------------------------- hex data, rapport, docx
            var createdFile = this.createFile(filedata, fileName, fileType); 
            this.downloadFile(createdFile, fileName, fileType);
    },

    createFile: function(hexContent, filename, type) {
        var data = this.convertHexToBinary(hexContent); // skip if your data is not hex
        var file = new Blob([data], {
            name: filename,
            type: type
        });
        return file;
    },

    convertHexToBinary: function(hexContent) {
        return new Uint8Array(hexContent.match(/.{2}/g).map(function(e) 
        {
            return parseInt(e, 16);
        }));
    },
    downloadFile: function(file, filename, type){
        if (window.navigator.msSaveOrOpenBlob)
            window.navigator.msSaveOrOpenBlob(file, filename);
        else { // Others
            var a = document.createElement("a"),
                url = URL.createObjectURL(file);
            a.href = url;
            a.download = filename + "." + type;
            document.body.appendChild(a);
            a.click();
            setTimeout(function() {
                document.body.removeChild(a);
                window.URL.revokeObjectURL(url);
            }, 0);
        }
    },
相关问题