PHP 创建文件以供下载,无需在服务器上保存

31

最终目标: 我想创建一个网页,让用户可以在表单中输入信息。使用这些信息,我想通过将所给信息插入到模板中来创建一个名为test-download.html的html文件,然后强制下载该文件。由于我想在即将举行的研讨会上演示这一点,人们会在“同一时间”使用它,因此我希望不要将文件保存在服务器上,而是直接强制下载。

到目前为止: 我的html文件(test.html)中有以下内容:

<form action="test.php" method="post">
To file: <input type="text" name="tofile" />
<input type="submit" />
</form>

而在我的test.php文件中是这样的:

<?php
$filename = 'test-download.html';
$htmlcode1 = "<HTML> \n <BODY>";
$htmlcode2 = "</BODY> \n <HTML>";
$somecontent = $htmlcode1.$_POST["tofile"].$htmlcode2;
!$handle = fopen($filename, 'w');
fwrite($handle, $somecontent);
fclose($handle);


header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Length: ". filesize("$filename").";");
header("Content-Disposition: attachment; filename=$filename");
header("Content-Type: application/octet-stream; "); 
header("Content-Transfer-Encoding: binary");

readfile($filename);

?>

这会覆盖test-download.html文件并强制下载。

问题:如何在不干扰服务器上的文件(test-download.html)的情况下完成这个操作?

2个回答

35

不要将其保存到文件中,只需在发送标头后使用 echo 命令即可。


@Thomas,在头文件之后这样做,并删除保存和读取文件代码。 - alex
我刚试了一下,似乎可以工作!有点惊艳的体验。再次感谢。 - Thomas
3
我的答案中唯一的代码是 echo,我不确定该怎么纠正。 - alex
感谢Thomas和Alex。由于没有文件了,我还将Content-Length更改为反映内容字符串的大小 :) 即header("Content-Length: ". strlen($somecontent).";"); - Ryan H.

20

请注意,每当一个PHP脚本响应请求时,它都会“生成一个文件”,该文件由浏览器下载。您使用echoprintprintf或其他标准输出来输出的任何内容都是这个“文件”的内容。

你所要做的就是告诉浏览器,这个“文件”应该被不同方式处理——你已经输出的那些标题应该已经做到了。一旦头部被发送,你打印输出的任何内容都变成了下载的内容。


谢谢您的解释。我不知道一个人不必保存文件,而是可以直接传递它进行下载。 - Thomas
2
@Thomas:是的,当你第一次意识到这一点时,它可能会让人有些震惊。但是浏览器基本上只是说“GET /some/url”,然后得到一堆字节(响应)和一些元数据(头部)。它不知道也不关心它们是如何生成的,或者它们存储在哪里,事实上它甚至不知道它们是否存储在任何地方。 - cHao
@cHao 我的思维 + 你的信息 = 惊叹! - usumoio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接