【问题标题】:Ajax post with a file return带有文件返回的 Ajax 帖子
【发布时间】:2016-08-05 12:46:19
【问题描述】:

有没有办法返回从 ajax post 结构中获取的服务器端动态生成的文件?

编写一个小的 web mvc 项目,它生成一个数据列表(数据是从复杂的聚合查询生成的,不能从 id 或其他任何地方调用),然后到我想要导出一些选定的部分部分到文件并下载。

它是如何工作的: 1.在页面上我选择了一些带有关键数据的字段(使用JQuery DataTable) 2.将其发送到控制器(准确地说是Spring) 3. 生成字节流并将其作为带有“Content-disposition”、“attachment”标头的 HTTPResponse 返回。

问题是我使用 JQuery->Ajax 选择行并形成所需的数据,因此 Controller->Post 的结果保留在 javascript 部分内,而不是给我“另存为...”。

我已经在考虑临时目录之类的了,但要保存最后一个选项。

【问题讨论】:

  • 很遗憾没有......
  • 但是我能不能以某种方式做一个非 ajax 帖子,应该打开一个新标签\窗口并接收正常的服务器回复,这将直接接收文件?
  • 显然..您可以发布表单...如果内容是可下载的文件,那么将弹出下载或自动下载开始,而不会丢失您当前的页面。
  • 就是这样。现在要弄清楚如何生成隐藏表单,将 JSON 放入其中,然后将其发布到服务器。

标签: java ajax spring file post


【解决方案1】:

很遗憾你不能通过ajax获取文件,但是你可以通过动态生成表单并提交来实现。根据我们对生成表单并提交的评论讨论,您可以执行类似的操作。

function autoSubmitForm(method, url, post_data) {
    var element = document.getElementById("virtual_form");
    if(element != null )
    {
        element.parentNode.removeChild(element);
    }
    var form = document.createElement("form");
    form.setAttribute("id", "virtual_form");
    form.setAttribute("style", "display:none;");
    form.method = method;
    form.action = url;   
    for(i in post_data)
    {
         var element=document.createElement("input");
         element.value=post_data[i];
         element.name=i;
         form.appendChild(element); 
    }
    document.body.appendChild(form);
    form.submit();

}

autoSubmitForm('POST','your_url.php',{id:"xyz",other_input:"input value"});

这里{id:"xyz",other_input:"input value"} 是发布数据的对象,您可以动态定义它的字段名称和字段值对。在函数中传递它。

【讨论】:

  • 谢谢。我现在试试
  • 同时我从我的代码中进行了编辑。 :) 所以请检查我的编辑
  • 我不认为 url 参数在这个函数中不起作用..因为我们可以根据需要传递 url。在函数中我们可以传递的方法是 GET 或 POST
  • @AntonTsyhanenko,这对你有用吗?如果是,请标记为正确并投赞成票。
  • 公平地说它没有。使用会话范围和参考文档的虚拟 id 来获得正常的文件返回(使用会话范围我设法将 sql 查询减少到最低限度)做了一个解决方法。仍然感谢您的帮助。
猜你喜欢
  • 2022-01-05
  • 1970-01-01
  • 2011-04-24
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 2018-11-01
  • 1970-01-01
相关资源
最近更新 更多