Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 12.12.2021
Сообщений: 65

Отдача двух файлов на скачивание, по раздельности, на одной странице

06.06.2025, 07:01. Показов 1086. Ответов 6

Студворк — интернет-сервис помощи студентам
Есть страница с php кодом, для отдачи файлов на скачивания.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// допустим есть два файла
$file_1 = "file/$prog_1";
$file_2 = "file/$prog_2";
 
    header("Content-Description: File Transfer");
    header("Content-Type: zip/winRAR");
    header("Content-Disposition: attachment; filename=".basename($file_1));
    header("Content-Transfer-Encoding:binary");
    header("Content-Length: ".filesize($file_1));   
    ob_clean();
    flush();
    
    readfile($file_1);  
    exit();
Код приведен просто для наглядности!

Есть два файла для скачивания '$prog_1' '$prog_2'

Но так как заголовки, и readfile, могут иметь только один аргумент.(?)

То скачать таким кодом можно только либо первый файл, либо второй (изменив имя файла).

Собственно мне это и нужно, чтобы пользователь мог скачать, любой файл из двух.

Но как это сделать?

Может через if, или скопировать два кода друг под другом, или скрипт с массивом?

Или это вообще не возможно сделать на одной странице?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.06.2025, 07:01
Ответы с готовыми решениями:

Отдача временного файла на скачивание, исправить код
Здравствуйте! Скажите пожалуйста что нетак $fp=tmpfile(); $tt=fwrite($fp,$content);...

Страница отдачи файлов php
Здравствуйте. Есть прямая ссылка на файл (mp3) но при ее открытии просто воспроизводит файл. Я...

php время отдачи страницы
что нужно настроить на сервере чтобы уменьшить время отдачи php страницы?

6
Эксперт PHP
 Аватар для liris
4351 / 996 / 148
Регистрация: 16.01.2023
Сообщений: 2,453
06.06.2025, 10:44
Цитата Сообщение от paris123 Посмотреть сообщение
header("Content-Type: zip/winRAR");
Интересный у вас MIME-тип. Не слышал о таком. Думаю имелось ввиду:

Code
1
application/vnd.rar
По сабжу:

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

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$allowedFiles = [
    'a.rar',
    'b.zip',
    'c.jpeg',
];
 
 
 
$requestedFile = $_REQUEST['filename'];
 
if (!in_array($requestedFile, $allowedFiles)) {
    exit("Ошибка! Запрошенный файл недоступен");
}
 
// ... ваш код для скачивания файла
Цитата Сообщение от paris123 Посмотреть сообщение
скопировать два кода друг под другом
Такой подход не будет работать, т.к. в вашей реализации возможно скачивание только одного файла. Если нужно отдать много файлов в одном запросе - подход должен быть другим.
0
Невнимательный
 Аватар для ft4l
2835 / 1260 / 357
Регистрация: 08.02.2013
Сообщений: 7,324
Записей в блоге: 2
06.06.2025, 11:09
Цитата Сообщение от paris123 Посмотреть сообщение
таким кодом можно только либо первый файл, либо второй (изменив имя файла).
Оно будет склеивать содержимое обоих файлов... если браузер/клиент по Content-Length не будет прерывать скачивание.

http это запрос-ответ .
в одном ответе можно передать одно тело ответа
https://developer.mozilla.org/... s/Messages
Последней частью ответа является его тело. Оно есть не у всех ответов: у ответов с кодом состояния, например, 201 или 204, оно обычно отсутствует.

Тела можно разделить на три категории:
  1. Одноресурсные тела (Single-resource bodies), состоящие из отдельного файла известной длины, определяемые двумя заголовками: Content-Type и Content-Length.
  2. Одноресурсные тела (Single-resource bodies), состоящие из отдельного файла неизвестной длины, разбитого на небольшие части (chunks) с заголовком Transfer-Encoding, значением которого является chunked.
  3. Многоресурсные тела (Multiple-resource bodies), состоящие из многокомпонентного тела, каждая часть которого содержит свой сегмент информации. Они относительно редки.
...
а исключением multipart/form-data типа, используемого в POST методе HTML форм, и multipart/byteranges типа, используемом в ответе 206 Partial Content для отправки части документа, HTTP никаким особым образом не обрабатывает многокомпонентные типы, и просто отправляет данные в браузер (который, с большой вероятностью, предложит сохранить переданный файл, тоже не зная как его обработать).
0
1 / 1 / 0
Регистрация: 12.12.2021
Сообщений: 65
06.06.2025, 11:28  [ТС]
liris, Я не понял a,b,c -это пример файлов для скачивания, или просто расширения?

И что будет стоять после применения кода в 'readfile' ?
0
Эксперт PHP
 Аватар для liris
4351 / 996 / 148
Регистрация: 16.01.2023
Сообщений: 2,453
06.06.2025, 13:54
Цитата Сообщение от paris123 Посмотреть сообщение
Я не понял a,b,c -это пример файлов для скачивания
Да, это пример файлов (у вас другие файлы будут).

1) На страничке, где вы выводите список файлов (там где пользователь выбирает, какой файл ему нужен) вы передаете название файла (или любой другой признак, позволяющий понять какой файл нам нужен) в виде параметра.
Например можно GET-параметром:

HTML5
1
2
<a href="get.php?filename=a.rar">Скачать файл a.rar</a><br>
<a href="get.php?filename=b.zip">Скачать файл b.zip</a>
В этом примере я делаю ссылку к скрипту get.php. А у вас там адрес вашего скрипта будет.

2) Нам нужно убедиться, что файл, который пользователь хочет - существует, доступен и у пользователя есть права на доступ к нему (у вас проверок может быть больше, я просто привожу пример):

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$allowedFiles = [
    'a.rar',
    'b.zip',
    'c.jpeg',
];
 
 
// Это имя выбранного файла
$requestedFile = $_REQUEST['filename'];
 
// Здесь строим путь к файлу (он будет другой)
$pathToFile = '/var/www/public/files/' . $requestedFile;
 
// Проверим, что файл можно скачивать
if (!in_array($requestedFile, $allowedFiles)) {
    exit("Ошибка! Запрошенный файл недоступен");
}
 
// Проверим, что файл существует
if (!file_exists($pathToFile)) {
    exit("Ошибка! Файл не найден");
}
3) Если файл доступен для скачивания и пользователь имеет право его скачать - просто отдаем его (это ваш код, я его не переделывал, по-хорошему, если типы файлов разные - MIME-тип надо указывать корректно):

PHP
1
2
3
4
5
6
7
8
9
10
header("Content-Description: File Transfer");
header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=".basename($pathToFile));
header("Content-Transfer-Encoding:binary");
header("Content-Length: ".filesize($pathToFile));   
ob_clean();
flush();
 
readfile($pathToFile);  
exit();
Добавлено через 6 минут
Цитата Сообщение от ft4l Посмотреть сообщение
Оно будет склеивать содержимое обоих файлов... если браузер/клиент по Content-Length не будет прерывать скачивание.
Если нужно одним ответом отдать несколько файлов - имхо, нужно паковать в архив. На стороне PHP можно это сделать с помощью ZipArchive. Довольно хорошо работает, но подходит только для небольших файлов, потому что скачивание не начнется, пока архив не будет полностью сформирован (а формирование происходит на сервере, сжирая оперативку и тратя место на диске).

Для больших файлов мне нравится решение на nginx + mod_zip. Отдача файлов начинается сразу же, архив формируется "на лету", отлично подходит для больших файлов. Но на shared хостинге такое может не работать.
2
1 / 1 / 0
Регистрация: 12.12.2021
Сообщений: 65
07.06.2025, 13:22  [ТС]
liris, Спасибо за помощь, но этот вариант у меня не работает.

Кнопка на скачивание находится очень далеко. Попробую понять логику, не получится брошу.
0
Эксперт PHP
 Аватар для liris
4351 / 996 / 148
Регистрация: 16.01.2023
Сообщений: 2,453
07.06.2025, 15:40
Цитата Сообщение от paris123 Посмотреть сообщение
но этот вариант у меня не работает
Расскажите и покажите, как вы делаете. Попробуем понять, что делаете не так.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.06.2025, 15:40
Помогаю со студенческими работами здесь

Отдача обработанной части страницы
Здравствуйте! Надо сделать так чтобы до определённой части скрипта отдался контент так как в этой...

Отдача файла во flash плеер
Здравствуйте! Подскажите кто может разобраться с одной проблемой. В общем, перерабатываю...

Отдача файлов скриптом PHP
Доброго времени суток! Предо мной стоит задача, отдавать файлы через PHP (защищая их от прямого...

подскажите - что не так ,отдача обрезаного файла
Здравствуйте! подскажите - что не так ,отдача обрезаного файла, вот Аяксом выводит обработаную...

Производительность при отдаче файла скриптом (Механизм отдачи изображений пользователю)
Доброго времени суток уважаемые! Возникла следующая задача: необходимо решить, как правильно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru