|
|
|
| Как реализовать такую штуку..?
Т.е. юзер вводит ссылку на файл, сервер вытягивает и отдаёт файл клиенту..
В данный момент всё работает, но если к примеру файл весит 1гб, тогда клиент должен ждать пока сервер качнёт файл(а сервер не ахти и валится изза нехватки памяти), а затем отдаст ему(клиенту).
Т.е. я так понимаю нужно качать по кускам, но как это правильно сделать?.. Кусок файла получилось выдернуть, как теперь отдать остальные кусочки, при этом не положив сервер и чтобы файл качался как бы в одном потоке?.. | |
|
|
|
|
|
|
|
для: sl1p
(17.05.2011 в 14:58)
| | Хм... а если ничего не отвечать клиенту, если данных нет? | |
|
|
|
|
|
|
|
для: cheops
(17.05.2011 в 15:28)
| | мм не совсем понял о чём вы)
Но случайно наткнулся на такую штуку..
http://i-novice.net/skript-dlya-zakachki-fajla-s-podderzhkoj-dokachki/
Работает, всё хорошо, но не мог бы ктонить объяснить её подробно?)) Ибо как пашет так и не понял.. Т.е. мне кажется что клиент вызывает скрипт постоянно, пока не докачает файл?..
<?
// $filepath – путь к файлу, который мы хотим отдать
// $mimetype – тип отдаваемых данных (можно не менять)
function func_download_file($filepath, $mimetype = 'application/octet-stream') {
$fsize = filesize($filepath); // берем размер файла
$ftime = date('D, d M Y H:i:s T', filemtime($filepath)); // определяем дату его модификации
$fd = @fopen($filepath, 'rb'); // открываем файл на чтение в бинарном режиме
if (isset($_SERVER['HTTP_RANGE'])) { // поддерживается ли докачка?
$range = $_SERVER['HTTP_RANGE']; // определяем, с какого байта скачивать файл
$range = str_replace('bytes=', '', $range);
list($range, $end) = explode('-', $range);
if (!empty($range)) {
fseek($fd, $range);
}
} else { // докачка не поддерживается
$range = 0;
}
if ($range) {
header($_SERVER['SERVER_PROTOCOL'].' 206 Partial Content'); // говорим браузеру, что это часть какого-то контента
} else {
header($_SERVER['SERVER_PROTOCOL'].' 200 OK'); // стандартный ответ браузеру
}
// прочие заголовки, необходимые для правильной работы
header('Content-Disposition: attachment; filename='.basename($filepath));
header('Last-Modified: '.$ftime);
header('Accept-Ranges: bytes');
header('Content-Length: '.($fsize - $range));
if ($range) {
header("Content-Range: bytes $range-".($fsize - 1).'/'.$fsize);
}
header('Content-Type: '.$mimetype);
fpassthru($fd); // отдаем часть файла в браузер (программу докачки)
fclose($fd);
exit;
}
|
| |
|
|
|