Catalyst
Новичок
Скачивание файлов через php / размер более 2 Гб
Добрый вечер.
Есть код, который отдаёт файлы через php, для скрытия их реального пути.
Код был составлен не без помощи участников этого форума.
Работал отлично с файлами до 1,5 Гб, до тех пор пока не понадобилось отдавать файлы размером 2-3 Гб.
Проблема в следующем: при скачивании получаю битый файл.
В основном это видео-файлы.
Т.е. например файл 2Гб читает практически корректно, но содержит ошибки.
Файл размером 2,9 Гб - последняя четверть фильма вообще не воспроизводится.
Буду рад, если укажите на причину возможной ошибки.
Ниже приведен код, который используется для отдачи:
Добрый вечер.
Есть код, который отдаёт файлы через php, для скрытия их реального пути.
Код был составлен не без помощи участников этого форума.
Работал отлично с файлами до 1,5 Гб, до тех пор пока не понадобилось отдавать файлы размером 2-3 Гб.
Проблема в следующем: при скачивании получаю битый файл.
В основном это видео-файлы.
Т.е. например файл 2Гб читает практически корректно, но содержит ошибки.
Файл размером 2,9 Гб - последняя четверть фильма вообще не воспроизводится.
Буду рад, если укажите на причину возможной ошибки.
Ниже приведен код, который используется для отдачи:
PHP:
<?php
function dl_file($filename, $razmer)
{
if (!file_exists($filename)) die('Файл не найден');
$from = 0;
$http_range = getenv("HTTP_RANGE");
if (!empty($http_range))
{
$range = substr($http_range, strpos($http_range, '=') + 1);
$from = strtok($range, '-');
header('HTTP/1.1 206 Partial Content');
}
else
{
header('HTTP/1.1 200 Ok');
}
header("Last-Modified: " . date("D, d M Y H:i:s ", filemtime($filename)). "GMT");
header("Accept-Ranges: bytes");
header("Content-Length: " . ($razmer - $from));
if (!empty($http_range))
{
//header($conrange);
header("Content-Range: bytes " . $from . "-" . ($razmer - 1) . "/" . $razmer);
}
header("Connection: close");
header("Content-Type: application/octet-stream");
header('Content-Disposition: attachment; filename="' . basename($filename) . '";');
$fp = fopen($filename, 'rb');
if ($from)
{
fseek($fp, $from);
}
while(!feof($fp))
{
echo fread($fp, 4096);
flush();
}
fclose($fp);
}
$file_size = sprintf("%u", filesize('bird.avi'));
dl_file('bird.avi', $file_size);
?>