提供从jQuery帖子下载的生成文件

时间:2012-02-01 19:07:05

标签: php jquery post

我有一个大表单,允许用户输入许多不同的字段,当他们完成后我需要将表单的内容发送到服务器,处理它,然后吐输出.txt文件,其中包含要下载的处理结果。现在,除了下载部分,我都设置好了。在对jQuery .post()的响应上设置标题似乎不起作用。有没有其他办法比做某种iframe技巧使这项工作(la JavaScript/jQuery to download file via POST with JSON data)?

同样,我将数据发送到服务器,处理它,然后想要用标题回显结果以提示下载对话框。我不想将结果写入磁盘,提供下载,然后从服务器中删除该文件。

3 个答案:

答案 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);
});