我有一个PHP脚本,只需要一些数据,将其分成制表符分隔格式,将其保存为.xls文件,然后为用户提供下载链接。
大部分时间都运行良好,但有些人正在获取导出的.xls文件的缓存版本。
我想我需要做的不是给用户直接链接到.xls文档,而是给他们一个PHP页面的链接:
deliver_excel_doc.php文件= some_excel_file.xls&安培;吗
然后 deliver_excel_doc.php 从excel文档中提取数据,但是使用标题执行某些操作,因此excel doc不会被缓存,然后输出为xls,因此文件将被下载(或在内部呈现) Excel文件)。
关于我如何做到这一点的任何想法(这个概念是否可行)?
答案 0 :(得分:6)
您可以在编写时对您的网址进行版本控制,但不要这样做,请发送正确的标题:
<?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
?>
答案 1 :(得分:3)
只需在获取Excel文件的链接中添加时间戳,例如
printf('<a href="file.xls?%d">Excel File</a>', time());
由于时间戳总是不同,因此他们的浏览器不会缓存文件。
答案 2 :(得分:2)
如果客户端正在缓存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将支持Expires标头,但为了使其按预期运行,客户端时钟必须与服务器时钟同步。
(请注意,如果您未设置时区,则date()会抛出警告)
下进行。