我有一个用php构建的网站,有一些.kml文件,我希望用户点击链接时能够下载,但它当前打开(浏览器中的xml-like)文件。我曾尝试调整.htaccess文件,但没有运气。得到一个文件下载,而不是打开浏览器
如何获取要下载的文件,而不是在浏览器中打开?
我有一个用php构建的网站,有一些.kml文件,我希望用户点击链接时能够下载,但它当前打开(浏览器中的xml-like)文件。我曾尝试调整.htaccess文件,但没有运气。得到一个文件下载,而不是打开浏览器
如何获取要下载的文件,而不是在浏览器中打开?
根据您的情况有两种不同的方法。
如果您的KML文件是静态的,并且您没有使用PHP直接提供它们,那么您应该考虑适当配置.htaccess
文件并确保您的Web服务器配置为观察.htaccess
文件。
如果您的KML文件是动态的或正在被PHP脚本代理,那么您需要提供正确的头文件来强制下载。鼓励下载标题是Content-Disposition
:
header("Content-Disposition: attachment; filename=\"$filename\"");
在PHP中,任何header
指令应该在任何其他的内容提供服务,包括任何空白。
如果您发现您的服务器没有配置观察.htaccess
文件,你不能对它进行配置,然后适当的这样一个简单的代理脚本会工作: -
<?php
header("Content-Disposition: attachment; filename=\"myData.kml\"");
include 'myData.kml';
?>
...更换相关的文件名。您可以使用变量扩展这些文件以适用于多个KML文件,但为了安全起见,请确保您的脚本检查所请求的文件是否有效,而不是盲目地“包括”所请求的任何文件。
这行代码在哪里?我是否也需要.htaccess中的指令? – FluxEngine
嗨马蒂,我已经充实了我的答复,希望能够帮助你... – Purpletoucan
为了强制浏览器下载文件,必须将HTTP Content-Disposition
标头设置为attachment
。有一种简单的方法来配置您的HTTP服务器,将此标头添加到所有.kml
文件和仅限PHP的方式。
Content-Disposition
头将在你的Apache配置以下或在.htaccess
文件,其中包含您的.kml
文件的目录内:
<Files "*.kml">
Header set Content-Disposition attachment
</Files>
您需要mod_headers
已启用这工作。
的PHP,唯一的解决办法的代理,但使用PHP脚本通过线路发送它。通过这种方式,您可以用脚本控制的HTTP标头:
<?php
header('Content-Disposition: attachment; filename="' . basename($path) . '"');
readfile($path);
?>
因此,我认为$path
是路径到您的服务器上的文件。如果您根据URL中提供的查询参数确定路径,则应始终检查是否给出了现有文件,允许用户下载该文件并确定该文件位于正确的目录中。请注意,即使您在请求中指定的字符串前缀在目录中,它也可能包含../
以访问其他目录中的文件。
这是一个很棒的答案,它的运作非常完美。从字面上看,1分钟的修复。 –
你可以试着将这些代码行.htaccess文件
<FilesMatch "\.(mp3|MP3)">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
它很适合我
你能做的唯一的事情就是“建议”来表示响应内容是浏览器一个“文件”,应该这样对待。 (请记住,HTTP没有“文件”的概念,只有标题和内容)。这是通过在响应中设置“content-disposition”标头完成的:http://en.wikipedia.org/wiki/List_of_HTTP_header_fields – David
如果您使用PHP强制下载目录中的文件,您可以将PHP从图片中移除,仅用于.htaccess http://stackoverflow.com/questions/3977159/set-content-disposition-header-to-attachment -only-on-files-in-certain-director – Orangepill