从Ajax下载文件(有点)

我在我的GSP中有这个ajax调用:

$.ajax({ url: '${request.contextPath + '/Ticket/passAll'}', type: 'POST', data: data, success: function() { alert("Success"); } }); 

这是我的控制器操作的代码块:

 response.setHeader("Content-disposition", "attachment; filename=sample.csv") response.contentType = "application/vnd.ms-excel" def outs = response.outputStream def cols = [:] tickets.each() { outs << it.ticketNo + ";" + it.subject outs << "\n" } outs.flush() outs.close() 

我通过$ .Ajax方法从视图传递的数据中获取票证列表。 比我将数据格式化为CSV并且我想将该数据导出为CSV文件但没有任何反应。 数据被发送到客户端,但没有文件可供下载,因为内容配置不是很好。 我错过了什么? 我试过做类似的事情:

 $.ajax({ url: '${request.contextPath + '/Ticket/passAll'}', type: 'POST', data: aoData, dataType: 'text', success: function(result) { var uri = 'data:application/csv;charset=UTF-8,' + encodeURIComponent(result); window.open(uri, 'tiketi.csv'); } }); 

并在控制器中我生成纯字符串,但这样我得到一个没有扩展名的文件,这是不可接受的。

我怎样才能做到这一点? 谢谢。

你不需要通过ajax来做。 该页面不会重定向文件下载。

我猜url属性应该固定,因为你的引号是碰撞的。

试试:

 $.ajax({ url: "${request.contextPath}/Ticket/passAll", type: 'POST', data: aoData, dataType: 'text', success: function(result) { var uri = 'data:application/csv;charset=UTF-8,' + encodeURIComponent(result); window.open(uri, 'tiketi.csv'); } }); 

据我所知,不可能通过AJAX触发文件下载。 相反,你可以做这样的事情(例如使用jQuery):

 function downloadComplete(){ hideSpinner();} function downloadStart(){ showSpinner();} function download(){ downloadStart() var urlParams = data // or eg $(form).serialize() var downloadUrl = "${request.contextPath}/Ticket/passAll?" + urlParams $("#download-iframe").remove() $(' 

您可能遇到问题,因为它是GET请求:“安全性”或者参数太多。 但在正常情况下应该没问题。

我在这一点上有点晚了,但偶然发现它做了一些研究。 这个解决方案有点长,并且从这里回答的各种问题拼凑而成。 我认为这是对这个问题的直接回答,我让它在一个应用程序中工作。

  

第一个函数是标准的ajax调用,用于从后端调用获取数据数组。 接下来是创建csv。 第二行调用格式化csv文件的第三个函数。 第二个函数从csv创建开始,最后创建一个动态链接,该链接附加到dom并单击以进行下载。 似乎更长的路,但使用标准的ajax调用后端。