保存由AJAX脚本生成的文件

时间:2012-03-21 16:48:31

标签: php ajax concurrency yii

晚上好。

我正在使用Yii框架和mPDF库通过Ajax脚本生成一些PDF文件,我需要在用户的浏览器中强制“另存为”对话。

我知道如何通过单个用户下载单个文件来解决此问题。 有没有人有一个提示,我怎么能让它在高负载系统上工作(例如,试图生成和下载PDF的几个用户将尝试访问一个临时文件,这将导致错误)?

我应该为每个会话生成一个单独的文件吗?哪种方式可以很好地清理这些临时文件?

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您应该使用tempnam http://www.php.net/manual/en/function.tempnam.php来生成临时文件。它们将被唯一命名,因此每个会话制作一个很容易。只需在完成后正常删除。

答案 1 :(得分:1)

制作一个不可见的iframe。从JS将iframe的src设置为生成PDF的服务器上的脚本。

 <iframe src="http://yoursite.com/download-file.php?report=pdf&param1=value1&param2=value2..." width="1" height="1"></iframe>

然后(我不确定你是怎么用mPDF做的)关键是将脚本中的文件直接输出到浏览器中。它是这样的:

 <?php 
     $x = some_function($_GET['param1'],$_GET['param2', ...); // PDF GEN. ROUTINE, BASED ON REQUEST DATA, HOWEVER YOU DO IT
     header('Content-type: application/pdf');
     echo $x;

这应该解决你所有的问题。

答案 2 :(得分:1)

首先,我建议您为每个生成的PDF生成不同的临时文件,以避免任何可能的错误,例如一个用户下载其他人的PDF等。

要清理临时目录,请使用删除超过N天的所有文件的cronjob。

为了强制保存对话框&#34;,您必须将Content-disposition标题设置为attachment

header('Content-Disposition: attachment; filename="myfile.pdf"');