Offer a generated file for download from jQuery post
我有一个大表单,允许用户输入许多不同的字段,当它们完成后,我需要将表单的内容发送到服务器,处理它,然后吐出一个包含该文件的.txt文件。 他们下载的处理结果。 现在,除了下载部分,我都已经完成了设置。 在对jQuery .post()的响应上设置标题似乎不起作用。 有没有其他方法比做某种iframe技巧使这项工作(一个JavaScript / jQuery下载文件通过POST与JSON数据)?
我再次将数据发送到服务器,处理它,然后想用标题回显结果以提示下载对话框。 我不想将结果写入磁盘,提供下载,然后从服务器中删除该文件。
不要使用AJAX。没有跨浏览器方式强制浏览器在JavaScript中显示一个存储对话框,用于通过AJAX从服务器接收的任意blob数据。如果您希望浏览器解释HTTP POST请求的结果(在这种情况下,提供下载对话框),则不要通过AJAX发出请求。
如果您需要通过AJAX执行某种验证,则必须执行两步过程,通过AJAX进行验证,然后通过将浏览器重定向到可以找到.txt文件的URL来启动下载。
在遇到类似问题的同时找到了这个帖子。这是我最终使用的解决方法:
1 2 3 | $.post('genFile.php', {data : data}, function(url) { $("body").append("<iframe src='download.php?url="+url+"' style='display: none;'></iframe>"); }); |
genFile.php使用随机生成的filename字符串在分段位置创建文件。
download.php读取生成的文件,设置MIME类型和处置(允许使用预定义的名称而不是实际文件名中的随机字符串),返回文件内容并通过删除源文件进行清理。
[编辑]不妨分享PHP代码......
的download.php:
1 2 3 4 5 6 7 | <?php $fname ="/tmp/".$_GET['url']; header('Content-Type: text/xml'); header('Content-Disposition: attachment; filename="plan.xml"'); echo file_get_contents($fname); unlink ($fname); ?> |
genFile.php:
1 2 3 4 5 6 7 8 9 |
您应该通过提交表单来执行普通的POST,而不是使用jQuery的
不过,我经常看到的一件事就是这样:
1 2 3 4 5 6 7 8 9 10 11 | $.post('generateFile.php', function(data) { // generateFile builds data and stores it in a // temporary location on the server, and returns // the URL to the requester. // For example, http://mysite.com/getFile.php?id=12345 // Open a new window to the returned URL which // should prompt a download, assuming the server // is sending the correct headers: window.open(data); }); |