
Последние записи
- Конвертер heic в jpg
- Проверка на шестнадцатеричный формат записи
- Отдать пользователю файл с помощью file_get_contents()
- Написать собственую функцию operator[] для битов
- Проблема с движением 2D человека
- OpenGl.Создание винтовой лестницы
- Склеить несколько файлов в один
- Windows 10 сменить администратора
- Рандомное слайдшоу
- Событие для произвольной области внутри TImage

Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk

Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
5th
Фев
Отдать пользователю файл с помощью file_get_contents()
Posted by obzor under php
может так?:
<?php
echo file_get_contents( "myfile.zip" );
?>
Тут надо отметить, что file_get_contents читает содержимого файла в память, а далее отдаем его в поток вывода с помощью echo. Подводный камень такого метода: если файл большой, можно не пройти по ограничению на использование памяти.
Более универсальный способ это сначала выяснить размер файла, определить ограничение по памяти, далее читать файл кусками и отдавать тоже кусками. Причем размер куска не должен быть равен ограничению по памяти (так как память будет занята и прочими данными). Можно условно взять половину от ограничения.
Хотя в каждом индивидуальном случае надо смотреть на расход памяти. Скажем, ТС указала, что список файлов и хешей хранятся в другом файле, а значит для их сопоставления тот файл тоже должен быть прочитан в память, после чего нужно будет найти реальное имя файла по его хешу. Это все тоже расходует оперативную память.
file_get_contents реализован через mmap. Но, конечно, надо поэкспериментировать с большими файлами. Там ещё надо будет правильный content type указывать через @header()
Проверил. Вот такой код для проверки:
<?php
download('1.zip');
// Функция отправит файл пользователю для загрузки
function download($filename){
$length = filesize($filename);
if ($length === false) return false;
header("Content-Type: application/octet-stream");
header("Content-Length: $length");
header('Content-Disposition: attachment; filename="' . rawurlencode(basename($filename)) . '"');
echo file_get_contents($filename);
return true;
}
Файл 1.zip у меня 17 Мб, в настройках php.ini установил лимит в 10 Мб: memory_limit=10M
По итогу в скаченный 1.zip попадает сообщение об ошибке:
<br />
<b>Fatal error</b>: Allowed memory size of 10485760 bytes exhausted (tried to allocate 18178800 bytes) in <b>D:\WWW\download\index.php</b> on line <b>12</b><br />
Естественно, никакого оригинального файла загрузить не удалось.
Так что либо ставить жесткий лимит на размер файла, если файл больше, то выдавать в браузер сообщение о том, что такой файл не может быть скачен. Либо отдавать файл кусками.
Но приведенная мною функция download($filename) полностью рабочая, если размер файла проходит по лимитам памяти. Возможно, для ТС она подойдет, если у него файлы маленькие.
Случайные статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту

пеллетные котлы

Пеллетный котел Emtas

Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)