Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 从Ajax下载文件(有点像)_Jquery_Ajax_Grails_Download - Fatal编程技术网

Jquery 从Ajax下载文件(有点像)

Jquery 从Ajax下载文件(有点像),jquery,ajax,grails,download,Jquery,Ajax,Grails,Download,我的GSP中有一个ajax调用: $.ajax({ url: '${request.contextPath + '/Ticket/passAll'}', type: 'POST', data: data, success: function() { alert("Success"); } }); 这是我的控制器操作的代码块: response.setHeader("Content-disposition", "attachment; fi

我的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()
在控制器中,我生成纯字符串,但这样我得到一个没有扩展名的文件,这是不可接受的


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

我想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来实现。页面不会重定向文件下载。

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

函数下载完成(){hideSpinner();}
函数downloadStart(){showSpinner();}
函数下载(){
下载开始()
var urlParams=data//或例如$(form).serialize()
var downloadUrl=“${request.contextPath}/Ticket/passAll?”+urlParams
$(“#下载iframe”).remove()
$('')。附于('正文');
}
您可能会遇到问题,因为它是GET请求:“安全性”或参数太多。
但在正常情况下,这应该没有问题。

我在这方面有点晚,但在做一些研究时偶然发现了它。这个解决方案有点长,是由这里回答的各种问题拼凑而成的。我认为这是对这个问题的直接回答,我已经在一个应用程序中使用了它

<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>

函数getCSV(){
console.log(“in get csv”);
$.ajax({
url:“”,
数据类型:“json”,
类型:“post”,
数据:{},
成功:功能(数据){
控制台日志(数据);

下载CSV({文件名:"我建议您创建一个隐藏的iframe/表单并发布到其中,这样当您的服务器返回csv时,下载就会像往常一样开始。无论如何,我必须同意James Kleeh和Gregg的观点,没有必要通过ajax调用来实现。为什么我的文件名不是
tiketi.csv
而是一个随机名称?@Phoenix
tiketi.csv
w作为提问的一部分,不确定您在问什么?window.location.href=“/ControllerName/downloadscsv?json=”+jsonStr;meCan的诀窍你能验证这一点吗?我喜欢这个答案,但我该怎么做才能让微调器消失?现在微调器显示,文件下载,但仅此而已。微调器保持在屏幕上。
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');
}
<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>