我有一个PHP脚本,它简单地接受一些数据,将其分割成标签分隔格式,将其保存为一个.xls文件,然后给用户一个链接来下载它。
大多数情况下工作正常,但有些人正在获取导出的.xls文件的缓存版本。
我认为我需要做的不是给用户一个指向.xls文档的直接链接,而是给他们一个链接一个PHP页面,如下所示:
deliver_excel_doc.php?file=some_excel_file.xls&
然后,deliver_excel_doc.php从excel文档中提取数据,但是使用头文件执行一些操作,这样excel文档就不会被缓存,然后输出为xls,这样文件就会被下载(或者在excel中呈现)。
对我如何做到这一点有什么想法(这个概念可行吗)?
发布于 2010-02-10 16:03:10
只需在获取Excel文件的链接中添加时间戳即可。
printf('<a href="file.xls?%d">Excel File</a>', time());因为时间戳总是不同的,所以他们的浏览器不会缓存文件。
发布于 2010-02-10 15:59:51
您可以在编写时对urls进行版本化,但不需要这样做,而是发送适当的标题:
<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>发布于 2010-02-10 16:30:52
如果客户端正在缓存PHP的输出,那么您有一个比您想象的更大的问题!
在正确设置缓存指令方面,erenon是部分正确的,但是,如果您使用过期的缓存日期向它提供服务,那么您会发现Excel经常无法打开文档(如果它通过MSIE访问)。一个更好的解决方案是在未来的几秒钟内设置一个到期时间,并要求代理程序不要缓存它:
if ($_SERVER['SERVER_PROTOCOL']=='HTTP/1.0') {
header("Expires: " . date('r', time()+3));
} else {
header("Cache-Control: max-age=3, private, must-revalidate");
}虽然HTTP/1.1将支持过期的报头,但要使其正常运行,客户端时钟必须与服务器时钟同步。
(注意,如果不设置时区,date()会抛出警告)
结果表明,C.
https://stackoverflow.com/questions/2238216
复制相似问题