1

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

您如何下载文件而不是在浏览器中打开?

4

3 回答 3

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 文件,但为了安全起见,请确保您的脚本检查所有请求的文件是否有效,而不是盲目地“包含”任何请求的文件。

于 2013-05-20T16:19:44.803 回答
2

为了强制浏览器下载文件,您必须将 HTTPContent-Disposition标头设置为attachment. 有一种简单的方法可以配置您的 HTTP 服务器以将此标头添加到所有.kml文件和仅 PHP 的方法。

1.配置Apache添加Content-Dispositionheader

将以下内容放在您的 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 中给出的查询参数确定路径,则应始终检查是否给出了现有文件、是否允许用户下载它以及它是否位于正确的目录中。请注意,即使您在请求中指定的字符串前面加上目录,它也可能包含../访问其他目录中的文件。

于 2016-03-14T16:25:45.857 回答
0

您可以尝试将这些代码行添加到您的 .htaccess 文件中

<FilesMatch "\.(mp3|MP3)">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>

这对我来说很有效

于 2016-03-24T08:54:29.600 回答