JavaScript / jQuery通过POST使用JSON数据下载文件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JavaScript / jQuery通过POST使用JSON数据下载文件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3256字,纯文字阅读大概需要5分钟。
内容图文
![JavaScript / jQuery通过POST使用JSON数据下载文件](/upload/InfoBanner/zyjiaocheng/717/312f9c8c53e1472f84b2a31100094d2b.jpg)
我有一个基于jquery的单页webapp.它通过AJAX调用与RESTful Web服务进行通信.
我正在努力完成以下任务:
>将包含JSON数据的POST提交到REST URL.
>如果请求指定了JSON响应,则返回JSON.
>如果请求指定了PDF / XLS / etc响应,则返回可下载的二进制文件.
我有1& 2现在正在工作,客户端jquery app通过基于JSON数据创建DOM元素来显示网页中返回的数据.从Web服务的角度来看,我也有#3工作,这意味着如果给出正确的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.pdf
Content-Length:5120
Content-Type:application/pdf
Server:Jetty(6.1.11)
另一个想法是生成PDF并将其存储在服务器上并返回包含该文件的URL的JSON.然后,在ajax成功处理程序中发出另一个调用,执行以下操作:
success: function(json,status) {
window.location.href = json.url;
}
但这样做意味着我需要对服务器进行多次调用,而我的服务器需要构建可下载的文件,将它们存储在某处,然后定期清理该存储区域.
必须有一种更简单的方法来实现这一目标.想法?
编辑:在查看$.ajax的文档后,我看到响应dataType只能是xml,html,script,json,jsonp,text之一,所以我猜测没有办法直接下载文件使用ajax请求,除非我按照@VinayC答案中的建议使用数据URI方案嵌入二进制文件(这不是我想做的事情).
所以我想我的选择是:
>不使用ajax而是提交表单帖子并将我的JSON数据嵌入到表单值中.可能需要搞乱隐藏的iframe等.
>不使用ajax而是将我的JSON数据转换为查询字符串以构建标准GET请求并将window.location.href设置为此URL.可能需要在我的单击处理程序中使用event.preventDefault()以防止浏览器从应用程序URL更改.
>使用我上面的其他想法,但通过@naikus答案的建议增强.使用一些参数提交AJAX请求,该参数允许Web服务知道通过ajax调用调用它.如果从ajax调用调用Web服务,只需返回带有URL的JSON到生成的资源.如果直接调用资源,则返回实际的二进制文件.
我想的越多,我越喜欢最后一个选项.通过这种方式,我可以获得有关请求的信息(生成时间,文件大小,错误消息等),我可以在开始下载之前对该信息采取行动.缺点是服务器上的额外文件管理.
还有其他方法吗?我应该注意这些方法的任何利弊?
解决方法:
letronje的解决方案仅适用于非常简单的页面. document.body.innerHTML =获取正文的HTML文本,附加iframe HTML,并将页面的innerHTML设置为该字符串.这将消除您的页面具有的任何事件绑定,以及其他内容.创建一个元素并改为使用appendChild.
$.post('/create_binary_file.php', postData, function(retData) {
var iframe = document.createElement("iframe");
iframe.setAttribute("src", retData.url);
iframe.setAttribute("style", "display: none");
document.body.appendChild(iframe);
});
或者使用jQuery
$.post('/create_binary_file.php', postData, function(retData) {
$("body").append("<iframe src='" + retData.url+ "' style='display: none;' ></iframe>");
});
这实际上是做什么的:用变量postData中的数据对/create_binary_file.php执行一个帖子;如果该帖子成功完成,请将新的iframe添加到页面正文中.假设来自/create_binary_file.php的响应将包含值’url’,这是可以从中下载生成的PDF / XLS / etc文件的URL.假设Web服务器具有适当的mime类型配置,将iframe添加到引用该URL的页面将导致浏览器促使用户下载该文件.
内容总结
以上是互联网集市为您收集整理的JavaScript / jQuery通过POST使用JSON数据下载文件全部内容,希望文章能够帮你解决JavaScript / jQuery通过POST使用JSON数据下载文件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。