2013-05-20 136 views
0

我有一个用php构建的网站,有一些.kml文件,我希望用户点击链接时能够下载,但它当前打开(浏览器中的xml-like)文件。我曾尝试调整.htaccess文件,但没有运气。得到一个文件下载,而不是打开浏览器

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

+0

你能做的唯一的事情就是“建议”来表示响应内容是浏览器一个“文件”,应该这样对待。 (请记住,HTTP没有“文件”的概念,只有标题和内容)。这是通过在响应中设置“content-disposition”标头完成的:http://en.wikipedia.org/wiki/List_of_HTTP_header_fields – David

+0

如果您使用PHP强制下载目录中的文件,您可以将PHP从图片中移除,仅用于.htaccess http://stackoverflow.com/questions/3977159/set-content-disposition-header-to-attachment -only-on-files-in-certain-director – Orangepill

回答

2

根据您的情况有两种不同的方法。

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

+0

这行代码在哪里?我是否也需要.htaccess中的指令? – FluxEngine

+0

嗨马蒂,我已经充实了我的答复,希望能够帮助你... – Purpletoucan

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

+0

这是一个很棒的答案,它的运作非常完美。从字面上看,1分钟的修复。 –

1

你可以试着将这些代码行.htaccess文件

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

它很适合我

相关问题