我有一个基于jquery的单页webapp。它通过AJAX调用与RESTful Web服务进行通信。
我正在尝试完成以下任务:
是否可以从像这样的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的文档后,我看到响应数据类型只能是之一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的页面将导致浏览器提示用户下载文件。
问题内容: 所以我知道有很多类似的帖子,但是我认为这足以满足自己的疑问: 我正在用PHP和jQuery构建XLS导出器。我正在尝试使用jQuery发布一个数组(我相信它与GET查询字符串一样长),并用它在我的服务器上生成XLS文件,然后用户可以下载该文件。 过去,我使用隐藏的iframe来完成此操作,但是由于它们只是重定向到url,因此这要求我使用GET,这使我感到紧张。 我的问题是:如果这些文件
问题内容: 我正在使用jQuery将div的HTML内容发布到PHP文件。HTML内容包含表,输入,较小的div,我想获取主DIV的内容并将其发送到数据库。我能想到的唯一选择是POST方法,但我不知道是否可以发送纯HTML。从div发送HTML内容到要插入MySQL的PHP文件还有其他选择吗? 谢谢。 编辑: 我现在能够使用jQuery的POST发送完整的HTML数据。但是,来自该DIV的HT
本文向大家介绍JavaScript 通过POST发送和接收JSON数据,包括了JavaScript 通过POST发送和接收JSON数据的使用技巧和注意事项,需要的朋友参考一下 示例 6 提取请求承诺最初将返回Response对象。它们将提供响应头信息,但它们不直接包含响应主体,而响应主体可能尚未加载。可以使用诸如Response对象上的方法来等待响应主体加载,然后对其进行解析。.json()
本文向大家介绍jQuery通过Ajax返回JSON数据,包括了jQuery通过Ajax返回JSON数据的使用技巧和注意事项,需要的朋友参考一下 服务端PHP读取MYSQL数据,并转换成JSON数据,传递给前端Javascript,并操作JSON数据。本文将通过实例演示了jQuery通过Ajax向PHP服务端发送请求并返回JSON数据。 JSON(JavaScript Object Notation
有人成功地从linux终端下载了wetransfer链接吗? thnx mart
问题内容: 我在服务器端有一个Struts2操作,用于文件下载。 但是,当我使用jQuery调用操作时: 在Firebug中,我看到数据是通过 Binary流 检索的。我想知道如何打开 文件下载窗口 ,用户可以用它在本地保存文件吗? 问题答案: 这是我现在建议的一些注意事项: 需要相对较新的浏览器 如果预期文件 很大,则 您可能应该执行与原始方法(iframe和cookie)类似的操作,因为以下某