关于php:提供一个生成的文件供jQuery帖子下载

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
<?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;
?>


您应该通过提交表单来执行普通的POST,而不是使用jQuery的.post(),并让服务器使用适当的Content-Encoding和MIME类型的标头进行响应。您无法通过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);
});