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
Javascript 在非ajax文章中包含json数据_Javascript_Ajax - Fatal编程技术网

Javascript 在非ajax文章中包含json数据

Javascript 在非ajax文章中包含json数据,javascript,ajax,Javascript,Ajax,我有一个JavaScript透视表,它向用户显示数据。用户可以选择列/行等。我添加了一个导出到Excel按钮,该按钮使用透视表json数据的当前数据/视图执行ajax post。它将数据发布到我的服务器,服务器将数据转换为Excel文件 创建文件都很好,但我的问题是如何将文件发送给用户。从我所读到的内容来看,我无法在一篇ajax文章之后向用户发送文件 我很高兴使用一个简单的html帖子,事实上这正是我想要的,因为我可以将用户重定向到文件,但我不知道如何将透视表数据作为帖子的一部分,因为它不是表单

我有一个JavaScript透视表,它向用户显示数据。用户可以选择列/行等。我添加了一个导出到Excel按钮,该按钮使用透视表json数据的当前数据/视图执行ajax post。它将数据发布到我的服务器,服务器将数据转换为Excel文件


创建文件都很好,但我的问题是如何将文件发送给用户。从我所读到的内容来看,我无法在一篇ajax文章之后向用户发送文件

我很高兴使用一个简单的html帖子,事实上这正是我想要的,因为我可以将用户重定向到文件,但我不知道如何将透视表数据作为帖子的一部分,因为它不是表单

我知道我可以在本地保存文件并发送一个url,但这会使事情复杂化,我希望避免这种情况


如果不将文件保存在本地并发送文件所在的url,是否可以执行此操作?

浏览器还不支持表单的JSON序列化,因此,恐怕不可能使用纯表单将JSON发送到后端

我有两种解决方案不需要在服务器上保存文件:

一个简单的解决方案是用JavaScript生成一个不可见的表单,创建名为json的隐藏输入,并用json内容填充它以发送到服务器。在服务器端,您将读取表单数据并解析存储在数据中的JSON。然后您只需生成文件并发送文件作为响应。浏览器应触发下载对话框

var form = document.createElement('form');
form.method = 'post';
form.action = 'url';
var input = document.createElement('input');
input.type = 'hidden';
textarea.name = 'json';
textarea.value = JSON.stringify(your_json);
form.appendChild(input);
document.body.appendChild(form);
form.submit();
form.parentNode.removeChild(form);
第二个选项使用ajax将数据发送到服务器。不过,浏览器需要支持多个API

您像往常一样执行JSON请求,服务器应该以头内容类型响应:这里是文件的MIME类型,响应主体中包含文件内容

客户端的代码应该如下所示:

var json = JSON.stringify({here: ['your', 'json', 'to', 'send', 'to', 'server']});
var xhr = new XMLHttpRequest();
xhr.open('POST', '/your/api/url', true);
xhr.setRequestHeader('Content-type', 'application/json');
xhr.responseType = 'arraybuffer';
xhr.addEventListener('load', function () {
  var blob = new Blob([this.response], { // reading response, not responseText
    type: this.getResponseHeader('Content-Type')
  });

  var url = URL.createObjectURL(blob);
  var a = document.createElement('a');
  a.href = url;
  a.download = 'file_name.txt'; // set proper extension
  document.body.appendChild(a); // it needs to be added to the document in order to work
  a.click();
  a.parentNode.removeChild(a);
});

xhr.send(json);

此外,创建的URL对象应该在某个时候被撤销,否则它们将一直存在,直到页面重新加载。但我认为,在用户下载文件之前,它们不能被撤销。因此,使用上述代码仍然是一项任务。

创建文件都很有效,但我的问题是通过将文件发送给用户来将文件发送给用户我想你是说将文件发送给浏览器?如果是这样的话,在将文件保存到服务器后,你应该有一个指向该文件的url链接,对吗?我不能在ajax发布后向用户发送文件是的,你可以不,我没有url链接。我在中创建文件memory@novice在您建议的方法中,它不向服务器发送任何post数据。我认为应在选项2中输入文本区域。除此之外,它工作得非常好!再次感谢