我有一个大表单,允许用户输入许多不同的字段,当他们完成后我需要将表单的内容发送到服务器,处理它,然后吐输出.txt文件,其中包含要下载的处理结果。现在,除了下载部分,我都设置好了。在对jQuery .post()的响应上设置标题似乎不起作用。有没有其他办法比做某种iframe技巧使这项工作(la JavaScript/jQuery to download file via POST with JSON data)?
同样,我将数据发送到服务器,处理它,然后想要用标题回显结果以提示下载对话框。我不想将结果写入磁盘,提供下载,然后从服务器中删除该文件。
答案 0 :(得分:10)
不要使用AJAX。没有跨浏览器方式强制浏览器在JavaScript中显示一个存储对话框,用于通过AJAX从服务器接收的任意blob数据。如果您希望浏览器解释HTTP POST请求的结果(在这种情况下,提供下载对话框),则不要通过AJAX发出请求。
如果您需要通过AJAX执行某种验证,则必须执行两步过程,通过AJAX进行验证,然后通过将浏览器重定向到.txt文件的URL来启动下载可以找到。
答案 1 :(得分:8)
在遇到类似问题的同时找到了这个帖子。这是我最终使用的解决方法:
$.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类型和处置(允许使用预定义的名称而不是实际文件名中的随机字符串),返回文件内容并通过删除源文件进行清理。
[edit]也可以分享PHP代码......
的download.php:
<?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:
<?php
$length = 12;
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str = substr( str_shuffle( $chars ), 0, $length ).'.xml';
$fh = fopen(('tmp/'.$str), 'w') or die("can't open file");
fwrite($fh,$_POST["data"]);
fclose($fh);
echo $str;
?>
答案 2 :(得分:7)
不是使用jQuery的.post()
,而是应该通过提交表单来执行正常的POST,并让服务器使用适当的Content-Encoding和MIME类型的标头进行响应。您无法通过post()
触发下载,因为jQuery会封装返回的数据。
我经常看到使用的一件事是:
$.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);
});