我有一个用php构建的网站,有.kml文件,我希望用户在点击链接时可以下载,但它当前在浏览器中打开(类似xml)文件。我试过调整.htaccess文件,但没有运气。
如何获取要下载的文件,而不是在浏览器中打开?
答案 0 :(得分:4)
根据您的情况,有两种不同的方法。
如果您的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文件,但为了安全起见,请确保您的脚本检查所有请求的文件是否有效,而不是盲目地“包含”所请求的任何文件。
答案 1 :(得分:2)
为了强制浏览器下载文件,您必须将HTTP Content-Disposition
标头设置为attachment
。有一种简单的方法可以配置HTTP服务器,将此标头添加到所有.kml
文件中,并且只支持PHP。
Content-Disposition
标头将以下内容放在Apache配置或包含.htaccess
文件的目录内的.kml
文件中:
<Files "*.kml">
Header set Content-Disposition attachment
</Files>
您需要启用mod_headers
才能生效。
Purpletoucan提出的纯PHP解决方案是不让浏览器直接访问文件,而是使用PHP脚本通过线路发送它。这样,您可以使用脚本控制HTTP标头:
<?php
header('Content-Disposition: attachment; filename="' . basename($path) . '"');
readfile($path);
?>
因此,我假设$path
是服务器上文件的路径。如果根据URL中给出的查询参数确定路径,则应始终检查是否已提供现有文件,是否允许用户下载该文件以及该文件位于正确的目录中。请注意,即使您在请求中指定的字符串前缀为目录,它也可以包含../
来访问其他目录中的文件。
答案 2 :(得分:0)
您可以尝试将这些代码行添加到.htaccess文件
<FilesMatch "\.(mp3|MP3)">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
它适合我