当前位置: 首页 > 面试题库 >

从Ajax中的服务器响应获取Excel文件(.xlsx)

谷良弼
2023-03-14
问题内容

在获得该文件的响应(成功的ajax方法)后,获取Excel文件并在浏览器中打开下载窗口时出现问题。我已经合适了Content-Type and Content-Disposition headers,我尝试在js中使用 Blob ,但我无法实现我想要的-简单文件下载。
我完成了几个版本的ajax,下面是其中的一个。我开发了一个ajax,它返回了由于损坏而无法正确打开的excel文件(尽管扩展名为.xlsx)。

也许问题出在Blob构造函数中使用了不合适的数据类型?

我尝试使用成功方法参数中的“ xhr.response”而不是“
data”,但是它也不起作用。我在Chrome的开发人员工具中检查了响应标头,并且它们设置正确。
重要的是-在服务器端创建的所有excel工作簿都是正确的,因为当数据是通过URL发送而不是通过ajax发布时,它可以在以前的版本中工作。

下面是Java / Spring服务器端的控制器方法:

response.reset();
response.setContentType("application/vnd.ms-excel");
response.addHeader("Content-Disposition","attachment;filename=\"" + className + " " +  title + ".xlsx\"");
    try (ServletOutputStream output = response.getOutputStream()){
        workbook.write(output);
        output.flush();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

我的Ajax下载文件并打开下载窗口:

$.ajax({
    url: myUrl,
    type: 'POST',
    data: myData,
    success: function(data, status, xhr) {
        var contentType = 'application/vnd.ms-excel';

        var filename = "";
        var disposition = xhr.getResponseHeader('Content-Disposition');
        if (disposition && disposition.indexOf('attachment') !== -1) {
            var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
            var matches = filenameRegex.exec(disposition);
            if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
        }
        console.log("FILENAME: " + filename);

        try {
            var blob = new Blob([data], { type: contentType });

            var downloadUrl = URL.createObjectURL(blob);
            var a = document.createElement("a");
            a.href = downloadUrl;
            a.download = filename;
            document.body.appendChild(a);
            a.click();

        } catch (exc) {
            console.log("Save Blob method failed with the following exception.");
            console.log(exc);
        }

问题答案:

看来JQuery在处理响应中的二进制数据时遇到了一些问题。我仅使用XMLHttpRequest,并将所有数据添加到URL。

var request = new XMLHttpRequest();
request.open('POST', url, true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.responseType = 'blob';

request.onload = function(e) {
    if (this.status === 200) {
        var blob = this.response;
        if(window.navigator.msSaveOrOpenBlob) {
            window.navigator.msSaveBlob(blob, fileName);
        }
        else{
            var downloadLink = window.document.createElement('a');
            var contentTypeHeader = request.getResponseHeader("Content-Type");
            downloadLink.href = window.URL.createObjectURL(new Blob([blob], { type: contentTypeHeader }));
            downloadLink.download = fileName;
            document.body.appendChild(downloadLink);
            downloadLink.click();
            document.body.removeChild(downloadLink);
           }
       }
   };
   request.send();


 类似资料:
  • 问题内容: 所以这是我的问题,我正在使用AJAX(jQuery)将表单发布到,但是页面实际上需要回显诸如或的响应。我不确定如何从中获取响应并将其存储为变量… 这是我到目前为止的代码: 我还需要在json中回显响应吗?还是纯文本会好? 抱歉,这听起来像是一个愚蠢的问题,这是我第一次在Ajax中进行此类操作。 PS:如何在上述代码中命名POST请求? 问题答案: 实际上,这是服务器上所需的全部内容。

  • 问题内容: 对于不正确的Ajax操作,我将HTTP标头代码设置为403并发送以下响应: 但是,在处理错误时我无法访问此数据…是否可以从jqXHR访问“消息”数据? 像jqXHR.message之类的东西? 非常感谢您的帮助… EDIt: 返回: 但是xhr.responseText.message不返回任何内容… 编辑:此代码有效: 问题答案: 您应该进入jQuery“错误”回调… http://

  • 服务器响应 如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。 属性 描述 responseText 获得字符串形式的响应数据。 responseXML 获得 XML 形式的响应数据。 responseText 属性 如果来自服务器的响应并非 XML,请使用 responseText 属性。 responseText

  • 我想用retforIt从服务器得到响应。下面是一些代码: 怎么了?我在哪里可以找到改装文档?是什么?请帮忙

  • 这是我关于StackOverflow的第一个问题,我希望我遵守了预期的标准。 我已经从不再在这里工作的其他人那里接管了一些代码,我几乎被困在这里。我搜索并询问了一些同事(不幸的是没有太多Java经验),但似乎没有人能帮助我。搜索也没有真正帮助我。 我正在从客户端向Netty服务器发送Json请求,故意不使用Netty实现。目前它只是一个简单的Java套接字,但其目的是让Flask客户端向Netty

  • 问题内容: 想象一下我运行这个: 在/ajax/watch.php内部,假设我有这个: 并且alert(responseText)返回: 而不是我需要的文本字符串。有什么帮助吗? 问题答案: 看起来您的jQuery以某种方式返回了XMLHttpRequest对象,而不是您的响应。 如果是这种情况,则应请求其属性,如下所示: 但是,如果这不起作用,则可能实际上是在接收JSON响应,并且您看到的可能是