javascript - 从 ajaxResponse 下载 docx 文件

标签 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);
}

最佳答案

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

   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);
        }
    },

关于javascript - 从 ajaxResponse 下载 docx 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53372174/

相关文章:

javascript - 刷新时,数组中新添加的元素将从数组列表本身中删除

javascript - 在javascript中显示hh :mm:ss. msmsms

ajax - CORS ajax 调用自签名安全 URL

php - 通过ajax检索php处理过的数据

javascript - 不同时区的javascript日期问题

javascript - ExtJS 传递 store.sync() 上的所有字段

Javascript - 输入验证 - 我可以检查字符 x 是否为数字且字符 y 是否为字母

sapui5 - 以 "sap.ui.define"风格编写 SAPUI5 控件渲染器

sapui5 - 事件参数在另一个事件后被覆盖?

javascript - 通过 JavaScript 加速将 HTML 元素附加到 div 中