获取文件而不是打开浏览器

时间:2013-05-20 16:15:11

标签: php .htaccess download

我有一个用php构建的网站,有.kml文件,我希望用户在点击链接时可以下载,但它当前在浏览器中打开(类似xml)文件。我试过调整.htaccess文件,但没有运气。

如何获取要下载的文件,而不是在浏览器中打开?

3 个答案:

答案 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。

1。配置Apache以添加Content-Disposition标头

将以下内容放在Apache配置或包含.htaccess文件的目录内的.kml文件中:

<Files "*.kml">
    Header set Content-Disposition attachment
</Files>

您需要启用mod_headers才能生效。

2。使用PHP脚本作为代理将文件发送到浏览器

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>

它适合我