研究和尝试了很多的测试&试验后,我发现关于header()
功能和readfile()
或相似的人的一些事实。
首先您应该知道header()
与不同浏览器存在兼容性问题。所以不要试图寻找完美无瑕的功能。这个问题不是PHP功能,它是浏览器有不同的方式分析下载头,所以他们都表现不同。你可能已经知道,最大的麻烦制造者是IE
如果要解决这个问题,并使其工作使用header()
,你必须添加/迫使一些标题详细信息(Content-Type
,等等),但是,这是不可能在你的php代码中。无论你尝试了多少次,它都不起作用。我对此没有太多的信息,但是我只知道即使在实际的header()
之前添加Content-Type
标题,它也不起作用。看起来他们完全是出于不同的目的。
您可以使用添加必要的报头,并使用readfile()
函数,然后它会正常工作。但是你应该知道这个函数会加载/读取你调用的内存中的文件/ url。这可能是一个很大的问题,可能会让你的网络服务器变慢,最糟糕的情况是它也可能崩溃。如果您的下载器或许多文件太多,就会发生这种情况。
不幸的是,正如我前面提到的,你不能在你的php代码中修复这个问题。所以我为了解决这个问题所做的是在我的webserver vhost中添加了头文件。
NGINX:
location ~ ^/.*\.mp3$ {
add_header Pragma "public";
add_header Expires "0";
add_header Cache-Control "must-revalidate, post-check=0, pre-check=0";
add_header Content-Disposition "attachment";
add_header Content-Type "application/force-download";
add_header Content-Type "application/octet-stream";
add_header Content-Type "application/download";
add_header Content-Transfer-Encoding "binary";
}
在我的情况下,该文件的用户必须下载为MP3格式。但是你可以改变它或者设置一个全局指令,这样它就可以使用任何格式。
只有失败了会前的数据已经输出等标题是为时已晚的原因。 – BugFinder
确保你在'header'之后有'exit'。 –
@AleksG我用完整的代码更新了帖子。你可以看到'header'没有回显或打印。 – xperator