Php 创建文件并下载它

Php 创建文件并下载它,php,html,download,Php,Html,Download,我正在尝试生成一个.html文件并下载它 我的问题:首先我检查文件是否存在,如果为真,我将删除它并创建一个新文件 当我单击生成文件时,下载的文件始终是创建的第一个文件,并且不会更新。我已经手动检查了文件,没问题,但下载的是旧的。如果我删除服务器上的文件,我仍然可以下载 检查现场:bit.ly/1crrcif $content = "<html></head></head><body>All content here</body><

我正在尝试生成一个.html文件并下载它

我的问题:首先我检查文件是否存在,如果为真,我将删除它并创建一个新文件

当我单击生成文件时,下载的文件始终是创建的第一个文件,并且不会更新。我已经手动检查了文件,没问题,但下载的是旧的。如果我删除服务器上的文件,我仍然可以下载

检查现场:bit.ly/1crrcif

$content =  "<html></head></head><body>All content here</body></html>";

   if( empty( $error )){ 

   echo "<h3>File generated</h3>";
   $my_file = 'change_nameto_index.html';
   if (file_exists($my_file)) {
       echo "file exists";
      unlink($my_file);
   }

   $new_file = 'change_nameto_index.html';
   $handle = fopen($new_file, 'w') or die('Cannot open file:  '.$new_file);
   $data = $content;
   fwrite($handle, $data);
   fclose($handle);
   echo "<a download='change_nameto_index.html' href='change_nameto_index.html'>"
      . "<b class='download'>Download</b></a>"
      ;
$content=“此处所有内容”;
if(空($error)){
回显“生成文件”;
$my_file='change_name to_index.html';
如果(文件_存在($my_文件)){
echo“文件存在”;
取消链接($my_文件);
}
$new_file='change_name to_index.html';
$handle=fopen($new_file,'w')或die($cannotopenfile:'。$new_file);
$data=$content;
fwrite($handle,$data);
fclose($handle);
回声“”
;
解决方案1: 尝试将此添加到下载页面标题:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

解决方案2:

我认为这是“缓存问题”。请尝试以下方法:

echo "<a download='index.html?".time()."' href='index.html?".time()."'><b class='download'>Download</b></a>";
echo”“;
这不是最好的方法,但可能是最快(也是最简单)的方法


添加一个每次都不同的参数(带有“?”和time())将使浏览器认为下载页面也不同,因此它将下载其最新版本

假装每个链接都是新的

一种防止可下载内容被缓存的技术是提供一个时间戳,将指向同一脚本的每个链接“伪造”为新的

  someScript.php
使用

   someScript.php?notUsedParameter=342342376
不,脚本没有使用参数
notUsedParameter
。它只是用来将指向
someScript.php
的链接标记为客户端浏览器的新链接

这种常见的技术是最常用的,可能是最稳定的

下一种技术在某种程度上取决于浏览器。例如,Internet Explorer对缓存/代理控制头有点挑剔。

在IE 8之前(包括IE 8),某些缓存/代理控制头有效地阻止了基于SSL的下载请求。Microsoft意识到了这个问题,并建议更改注册表

强制浏览器/代理不保存链接的内容

另一个选项是告诉浏览器/代理不缓存当前请求

header('Pragma: public');   
header('Expires: 0');       
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Last-Modified: Date Wed, 19 Feb 2000 23:45:13 GMT' );
header('Cache-Control: private', false);

我尝试过这个解决方案,效果很好,但我正在寻找另一个选项,你能帮忙吗?未关闭:if(空($error)){