用PHP将字符串写入文件并强制下载

6

我正在研究如何从字符串创建文件。这个字符串可以是纯文本,保存为 .txt 格式,也可以是 PHP 文件,保存为 .php 格式等。但我希望能够获得一些相关的见解。

**我找到了下面这段代码:

$file = 'people.txt';
// Open the file to get existing content
$current = file_get_contents($file);
// Append a new person to the file
$current .= "John Smith\n";
// Write the contents back to the file
file_put_contents($file, $current);

我需要在服务器上保存people.txt吗?
强制下载部分
header("Content-Disposition: attachment; filename=\"" . basename($File) . "\"");
header("Content-Type: application/force-download");
header("Content-Length: " . filesize($File));
header("Connection: close");

以上代码需要放在哪里?我假设代码能够正确地强制下载我的预先准备好的文件?


简短回答:不需要先创建文件。但是,如果你要读取一个不存在的文件,请尝试使用fopen($file, 'w+')。之后,在强制下载头部之后,只需输出字符串即可。 - h2ooooooo
1个回答

32

您不需要将字符串写入文件才能将其发送到浏览器。请参见以下示例,它将提示您的UA尝试下载一个名为“sample.txt”的文件,其中包含$str的值:

<?php

$str = "Some pseudo-random
text spanning
multiple lines";

header('Content-Disposition: attachment; filename="sample.txt"');
header('Content-Type: text/plain'); # Don't use application/force-download - it's not a real MIME type, and the Content-Disposition header is sufficient
header('Content-Length: ' . strlen($str));
header('Connection: close');


echo $str;

1
HTTP目前我所知道的没有提供这方面的功能。 - TML
假设在将输出发送到浏览器的其他代码之前执行了此下载代码。如何防止进一步的输出被放入下载文件中?有些答案说要添加 exit();,但如果您有一些运行中的日志记录代码或其他不想切断的东西,那么这是不可行的。 - Buttle Butkus
我不清楚你的问题是什么,但它肯定应该成为自己的SO问题,而不是埋在已被标记为“不是一个真正的问题”两年以上的评论中... - TML
那听起来好像是很多工作。 - Buttle Butkus
1
答案非常简单 - 不要将这个 PHP 代码放在一个带有大量 HTML 的文件的顶部。将其制作为一个独立的 PHP 脚本,用 echo 输出可下载内容,然后停止处理。 - TML
显示剩余2条评论

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