我有一個用php構建的網站,有一些.kml文件,我希望用戶點擊鏈接時能夠下載,但它當前打開(瀏覽器中的xml-like)文件。我曾嘗試調整.htaccess文件,但沒有運氣。得到一個文件下載,而不是打開瀏覽器
如何獲取要下載的文件,而不是在瀏覽器中打開?
我有一個用php構建的網站,有一些.kml文件,我希望用戶點擊鏈接時能夠下載,但它當前打開(瀏覽器中的xml-like)文件。我曾嘗試調整.htaccess文件,但沒有運氣。得到一個文件下載,而不是打開瀏覽器
如何獲取要下載的文件,而不是在瀏覽器中打開?
根據您的情況有兩種不同的方法。
如果您的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文件,但爲了安全起見,請確保您的腳本檢查所請求的文件是否有效,而不是盲目地「包括」所請求的任何文件。
這行代碼在哪裏?我是否也需要.htaccess中的指令? – FluxEngine
嗨馬蒂,我已經充實了我的答覆,希望能夠幫助你... – Purpletoucan
爲了強制瀏覽器下載文件,必須將HTTP Content-Disposition
標頭設置爲attachment
。有一種簡單的方法來配置您的HTTP服務器,將此標頭添加到所有.kml
文件和僅限PHP的方式。
Content-Disposition
頭將在你的Apache配置以下或在.htaccess
文件,其中包含您的.kml
文件的目錄內:
<Files "*.kml">
Header set Content-Disposition attachment
</Files>
您需要mod_headers
已啓用這工作。
的PHP,唯一的解決辦法的代理,但使用PHP腳本通過線路發送它。通過這種方式,您可以用腳本控制的HTTP標頭:
<?php
header('Content-Disposition: attachment; filename="' . basename($path) . '"');
readfile($path);
?>
因此,我認爲$path
是路徑到您的服務器上的文件。如果您根據URL中提供的查詢參數確定路徑,則應始終檢查是否給出了現有文件,允許用戶下載該文件並確定該文件位於正確的目錄中。請注意,即使您在請求中指定的字符串前綴在目錄中,它也可能包含../
以訪問其他目錄中的文件。
這是一個很棒的答案,它的運作非常完美。從字面上看,1分鐘的修復。 –
你可以試着將這些代碼行.htaccess文件
<FilesMatch "\.(mp3|MP3)">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
它很適合我
你能做的唯一的事情就是「建議」來表示響應內容是瀏覽器一個「文件」,應該這樣對待。 (請記住,HTTP沒有「文件」的概念,只有標題和內容)。這是通過在響應中設置「content-disposition」標頭完成的:http://en.wikipedia.org/wiki/List_of_HTTP_header_fields – David
如果您使用PHP強制下載目錄中的文件,您可以將PHP從圖片中移除,僅用於.htaccess http://stackoverflow.com/questions/3977159/set-content-disposition-header-to-attachment -only-on-files-in-certain-director – Orangepill