2013-05-20 2 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-a-an-director – Orangepill

ответ

2

В зависимости от вашего сценария существует два разных подхода.

Если ваши файлы KML являются статическими, и вы обслуживаете их напрямую без PHP, тогда вы должны правильно настроить файл и убедиться, что ваш веб-сервер настроен на наблюдение за файлами .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-only.

1. Настройка Apache для добавить Content-Disposition Header

Поместите следующий в конфигурации Apache или в .htaccess файла внутри каталога, содержащего ваши .kml файлы:

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

Вам нужно mod_headers включена это работать.

2. Используйте PHP скрипт как прокси-сервер для отправки файла в браузер

РНР-единственное решение, как это было предложено Purpletoucan бы не позволить доступ браузера файл напрямую, но использовать 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> 

он работает хорошо для меня

Смежные вопросы