为了账号安全,请及时绑定邮箱和手机立即绑定

请问JavaScript/jQuery通过带有JSON数据的POST下载文件

请问JavaScript/jQuery通过带有JSON数据的POST下载文件

萧十郎 2019-08-02 12:02:46
JavaScript/jQuery通过带有JSON数据的POST下载文件我有一个基于jQuery的单页面网页应用程序。它通过Ajax调用与RESTful Web服务进行通信。我正在努力做到以下几点:将包含JSON数据的帖子提交给REST url。如果请求指定了JSON响应,则返回JSON。如果请求指定PDF/XLS/etc响应,则返回一个可下载的二进制文件。现在我已经有了1&2的工作,客户机jQuery应用程序通过基于JSON数据创建DOM元素在Web页面中显示返回的数据。我还让#3从web服务的角度工作,这意味着如果给出正确的JSON参数,它将创建并返回一个二进制文件。但我不确定在客户端javascript代码中处理#3的最佳方法。可以从这样的Ajax调用中获得可下载的文件吗?如何让浏览器下载并保存文件?$.ajax({     type: "POST",     url: "/services/test",     contentType: "application/json",     data: JSON.stringify({category: 42, sort: 3, type: "pdf"}),     dataType: "json",     success: function(json, status){         if (status != "success") {             log("Error loading data");             return;         }         log("Data loaded!");     },     error: function(result, status, err) {         log("Error loading data");         return;     }});服务器使用以下标头进行响应:Content-Disposition:attachment; filename=export-1282022272283.pdfContent-Length:5120Content-Type:application/pdfServer:Jetty(6.1.11)另一个想法是生成PDF并将其存储在服务器上,并返回包含文件URL的JSON。然后,在Ajax成功处理程序中发出另一个调用,执行如下操作:success: function(json,status) {     window.location.href = json.url;}但是这样做意味着我需要对服务器进行不止一个调用,我的服务器需要构建可下载的文件,将它们存储在某个地方,然后定期清理存储区域。必须有更简单的方法来实现这一点。想法?编辑:在查看了$.ajax的文档之后,我发现响应数据类型只能是xml, html, script, json, jsonp, text因此,我猜想没有办法使用Ajax请求直接下载文件,除非我按照@VinayC答案中的建议将二进制文件嵌入到使用数据URI方案中(这不是我想做的事情)。所以我想我的选择是:不要使用Ajax,而是提交表单POST并将我的JSON数据嵌入到表单值中。可能需要处理隐藏的IFRAMES之类的问题。不要使用Ajax,而是将我的JSON数据转换为查询字符串来构建一个标准的GET请求并将window.location.href设置为这个URL。可能需要在我的单击处理程序中使用Event.PretectionDefault(),以防止浏览器从应用程序URL中更改。请使用上面我的另一个想法,但通过@Naikus的回答提供建议来增强它的功能。提交带有一些参数的Ajax请求,让web服务知道这是通过Ajax调用的。如果Web服务是从Ajax调用中调用的,只需向生成的资源返回带有URL的JSON。如果直接调用资源,则返回实际的二进制文件。我想的越多,我就越喜欢最后的选择。这样我就可以获得有关请求的信息(生成时间、文件大小、错误消息等)。在开始下载之前,我可以根据这些信息采取行动。缺点是服务器上额外的文件管理。还有其他方法可以做到这一点吗?我应该知道这些方法的利弊吗?
查看完整描述

3 回答

  • 3 回答
  • 0 关注
  • 502 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信