2013-05-20 133 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> 

它很適合我

相關問題