0

我有一个包含网格和按钮的应用程序,用户可以将网格导出到 Excel。当服务器使用 excel 文件响应时,我希望能够显示另存为对话框。服务器接受参数作为 JSON 对象。这是我的代码:-

Ext.Ajax.request({
   url: '/export/excel/',
   method: 'POST',
   //Send the query as the message body
   jsonData: jsonStr,
   success: function (result,request) {
        Ext.DomHelper.append(document.body, {
           tag: 'iframe',
            frameBorder: 0,
            width: 0,
            height: 0,
            //src:result,
            css: 'display:none;visibility:hidden;height:1px;'
        });
    }, //success
    failure: function (response, opts) {
        var msg = 'server-side failure with status code: ' + response.status + ' message: ' + response.statusText;
        Ext.Msg.alert('Error Message', msg);
    }
});

我知道有一个类似的问题(ExtJS AJAX 另存为对话框),但它引用了服务器上的静态文件。在我的情况下,根据发送的 json,结果每次都会有所不同。我在 result.responseText 中取回了我想要的整个 excel 文件。需要做什么才能弹出对话框询问用户另存为选项?另外,我不确定src应该如何配置 domhelper 中的。任何帮助将非常感激。

4

2 回答 2

2

我相信以完全与客户端无关的方式执行此操作的唯一方法是从服务器端使用 Content-Type 强制它:octect-stream 和 Content-Disposition 的“附件”以及建议的文件名。看:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1

http://www.ryboe.com/tutorials/php-headers-force-download

您也可以使用所谓的“dataURI”,但它们有自己的一系列问题:

http://en.wikipedia.org/wiki/Data_URI_scheme

我的建议是在服务器上动态返回 EXCEL 内容,然后将按钮设为指向该 url 的链接,该链接发布您正在使用的当前数据并设置正确的响应标头以触发您的浏览器下载文件。由于您正在执行 AJAX 调用并且不让 Web 浏览器直接获取 URL,因此您设置用于控制浏览器解释内容方式的任何 HTTP 标头都无关紧要,因为您是在 JS 中而不是在用户的浏览器中执行此操作。通过服务器上的链接将内容直接返回给用户,您将解决这个问题。

由于您实际上希望用户单击链接,因此我认为 AJAX 在这里不合适。

于 2012-04-22T02:17:46.337 回答
1

我让服务器端返回文件创建和保存位置的路径,而不是在响应中将文件作为附件发送,从而避免在响应中设置标题的问题。result.responseText然后我只是将代码中 iframe 的源设置为在响应 ( )中返回的路径。

于 2012-04-24T19:11:22.483 回答