Отдача файлов на скачивание PHP

В PHP отправка файла в браузер на скачивание осуществляется в 2 этапа:

1

Первый вариант с явным указанием типа файла mime:

$file = __DIR__ . '/file.avi';

header('Content-Description: File Transfer');
header('Content-Type: video/x-msvideo');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
PHP

Второй, application/octet-stream – «двоичный файл без указания формата».

$file = __DIR__ . '/file.avi';

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
PHP

Заголовок с размером файла – header('Content-Length: ' . filesize($file)); можно не указывать.

2

Перед отправкой файла нужно убедится что буферизация вывода отключена с помощью ob_get_level() или сбросить и отключить ее функцией ob_end_clean().

Непосредственно чтение и вывод файла можно сделать следующими функциями:

readfile

readfile($file);
exit();
PHP

fread

if ($handle = fopen($file, 'rb')) {
	while (!feof($handle)) {
		echo fread($handle, 1024);
	}
	fclose($handle);
}
exit();
PHP

file_get_contents

echo file_get_contents($file);
exit();
PHP

Полный пример

ob_end_clean();

$file = __DIR__ . '/file.avi';

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));

readfile($file);
exit();
PHP
06.08.2019, обновлено 30.09.2019
28432

Комментарии 1

Александр Антонов Александр Антонов
28 марта 2023 в 11:15
Не работает, пример взял целиком, единственное что добавил это создание файла, так как у меня json я сначала собираю данные потом создаю файл и дальше ваш код

, чтобы добавить комментарий.

Другие публикации

Отправка письма с вложением
Отправка e-mail в кодировке UTF-8 с вложенными файлами и возможные проблемы.
12012
+3
Примеры использования cURL в PHP
cURL PHP – это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS....
217122
+21
Преобразование CSV в XLSX на PHP
В статье приведены два примера конвертации фалов csv в xlsx, алгоритм следующий...
8931
+2
Работа с FTP в PHP
Протокол FTP – предназначен для передачи файлов на удаленный хост. В PHP функции для работы с FTP как правило всегда доступны и не требуется установка дополнительного расширения.
18188
+2
Бот Телеграм на PHP
Примеры как зарегистрировать бота в Телеграм, описание и взаимодействие с основными методами API.
140323
+44
Использование API Яндекс Диска на PHP
Можно найти множество применений Яндекс Диска на своем сайте, например, хранение бекапов и отчетов, обновление прайсов,...
55547
+20