FoxWeb

софт для студентов
Искать здесь

Основы протокола HTTP: скачивание файлов с нужным именем

Раздел: PHP, MySQL, веб-программирование Автор: foxweb
E-mail: спаму - нет! Www: http://foxweb.net.ru
Просмотров: 1977 Дата: 13.02.2007
Как загружать файлы через PHP-скрипт с произвольным именем, а не с именем этого скрипта?

При помощи PHP можно читать файлы и скачивать их через браузер, но при сохранении этого файла браузер сохранит его под именем скрипта. Например, файл download.php будет выдавать PDF-файл, но браузер всё равно сохранит его под именем download.php и правильно сделает, потому что отправляется не сам файл, а его содержимое, прочитанное скриптом. Вот пример такого скрипта:

<?php
// скачивание файла original.pdf
readfile('original.pdf');
?>

Выхода у нас два: или делаем перенаправление или посылаем файл как вложение.

Первый способ простой: вызываем функцию header("Location: /files/original.pdf"); скрипт завершается, а браузер начинает скачивание указанного файла.

Способ второй: используем дополнительные заголовки HTTP-ответа, чтобы браузер принял не просто данные, а как вложение (аналогия с вложениями в электронных письмах).

<?php
// сообщаем тип данных - PDF
header('Content-type: application/pdf');

// файл будет получен с именем downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// начинаем передачу содержимого любого файла, например original.pdf
readfile('original.pdf');
?>

При выполнении этого скрипта браузер предложит скачать и сохранить файл downloaded.pdf независимо от имени скрипта. Скрипт может называться как угодно. Уже в который раз напоминаю, что HTTP-заголовки в функции header() должны быть отправлены до начала отправки непосредственно данных, будьте внимательны.

Комментарии

tema 27.09.2007 02:38:58 #
ОБъяните, что значит
"HTTP-заголовки в функции header() должны быть отправлены до начала отправки непосредственно данных"

ОБъясните, как сделать, чтобы этм заголовки были отправленны до непосредственно отправки данных? Куда и что надо написать?

P.S.
Если ваш скрипт написать так как он здесь представлен, он не работает...
tema 27.09.2007 02:43:46 #
Беру слова назад.. внезапно заработало...
Так и не понял в чем дело.

вопрос про заголовки не отпал...
tema 27.09.2007 02:52:02 #
Существует ли возможность чтобы во втором хедере писать не filename="downloaded.pdf"

А присовить значение перменной (что-товроде filename=$dwfile)
tema 27.09.2007 04:14:51 #
все разобрался... кавычку можно левее ставить...

filename='.$dwfile );

а хедеры везде можно ставить ,главное, чтобы readfile был после хедеров
Александр 06.01.2008 22:49:53 #
При выполнении кода pdf не загружается, а выводится в страницу браузера (IE). Как сделать, чтобы файл скачивался?
foxweb 07.01.2008 02:25:05 #
Александр, можно попробовать

Content-type: application/octet-stream

или любую строку после слэша — всё неизвестное браузеры обычно скачивают.
Михаил 06.06.2008 11:59:46 #
Насчет заголовков
"вопрос про заголовки не отпал..."
функция хеадер будет работать насколько я знаю если до нее не было ни 1 вывода в браузер, то есть не использовалась напрмиер функция ECHO, иначе хеадер не сработает
Nikitian 04.09.2008 11:38:42 #
Про заголовки: мало того, что не должно быть echo и прочих выводов, не должно быть даже пробелов и переносов строк перед "
Nikitian 04.09.2008 11:41:58 #
Чёрт, тег не пропустило. Попробую ещё раз:
не должно быть даже пробелов и переносов строк перед ">php". Об этом часто забывают и получают ошибку отправки хидера.
Nikitian 04.09.2008 11:42:31 #
"<?php"
Совсем html забыл :)

Оставить комментарий

Ваше имя

Ваш комментарий

Код   Защитный код. Если вы не видите здесь рисунок - обновите страницу.
Оценка   

Заметки по этой теме