我在我的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');
}
});
并在控制器中生成纯字符串,但这样我得到的文件没有扩展名是不可接受的。
我怎样才能做到这一点?谢谢。
答案 0 :(得分:14)
你不需要通过ajax来做。该页面不会重定向以进行文件下载。
答案 1 :(得分:6)
我猜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');
}
});
答案 2 :(得分:6)
据我所知,不可能通过AJAX触发文件下载。 相反,你可以做这样的事情(例如使用jQuery):
function downloadComplete(){ hideSpinner();}
function downloadStart(){ showSpinner();}
function download(){
downloadStart()
var urlParams = data // or e.g. $(form).serialize()
var downloadUrl = "${request.contextPath}/Ticket/passAll?" + urlParams
$("#download-iframe").remove()
$('<iframe style="display:none" id="download-iframe" src="' + downloadUrl + '" onreadystatechange="downloadComplete()" onload="downloadComplete()">').appendTo('body');
}
您可能遇到问题,因为它是GET请求:“安全性”或参数太多。 但在正常情况下应该没问题。
答案 3 :(得分:0)
我对此有些迟,但是偶然发现它做了一些研究。这个解决方案要更长一些,并且可以从这里回答的各种问题中找到答案。我认为这是对这个问题的直接答案,并且可以在应用程序中使用它。
<script>
function getCSV() {
console.log("in get csv");
$.ajax({
url: "<url string>",
dataType: 'json',
type: "post",
data: {},
success: function (data) {
console.log(data);
downloadCSV({filename: "<filename.csv", data: data.<array from
backend call>});
},
error: function () {
}
});
}
}
function downloadCSV(args) {
var data, filename, link;
var csv = convertArrayOfObjectsToCSV({
data: args.data
});
if (csv == null) return;
filename = args.filename || 'export.csv';
if (!csv.match(/^data:text\/csv/i)) {
csv = 'data:text/csv;charset=utf-8,' + csv;
}
data = encodeURI(csv);
link = document.createElement('a');
link.setAttribute('href', data);
link.setAttribute('download', filename);
link.click();
}
function convertArrayOfObjectsToCSV(args) {
var result, ctr, keys, columnDelimiter, lineDelimiter, data;
data = args.data || null;
if (data == null || !data.length) {
return null;
}
columnDelimiter = args.columnDelimiter || ',';
lineDelimiter = args.lineDelimiter || '\n';
keys = Object.keys(data[0]);
result = '';
result += keys.join(columnDelimiter);
result += lineDelimiter;
data.forEach(function (item) {
ctr = 0;
keys.forEach(function (key) {
if (ctr > 0) result += columnDelimiter;
result += item[key];
ctr++;
});
result += lineDelimiter;
});
return result;
}
</script>
第一个功能是标准ajax调用,用于从后端调用中获取数据数组。接下来是创建csv。第二行调用格式化csv文件的第三个函数。第二个功能从csv创建开始,最后创建一个动态链接,该链接附加到dom上并单击以下载。似乎需要更长的时间,但是可以与后端的标准ajax调用一起使用。