Ситуация такая: У нас на сервере ограничение на скачивание avi файлов. У меня есть доступ к нескольким хостингам. Задача такая: как организовать php тунель для скачивания файлов, изменив им расширение. P.S. Вот, например, на Зайцев.нет можно скачивать файлы с расширением rar, exe... вряд ли они хранят все файлы с разными вариантами расширений. Но как же они, тогда это делают?
Все немного сложнее... нужно подконнектится к FTP(не проблема) и взять оттуда файл(не проблема), потом, заменив его расширение выдать его через HTTP. Хорошо бы, если бы была возможность докачки. И нужно учесть ограниченость пространства хостинга.
нисколько. вы по первой ссылке в поиск ходили? первый же результат поиска - пример для вас. вам остается подкорректировать всего пару строк.
Ну не знаю... Код (Text): while(!feof($f) and !connection_status() and ($downloaded<$size)) { echo fread($f, 512000); $downloaded+=512000; flush(); } тут, насколько я понимаю, оно качает часть файла. А как скачать часть файла с ftp?
Очевидно Ex имел в ввиду что файл может закачиваться непосредственно через FTP? Тогда PHP тут не поможет
Все, я разбуплился... все работает: PHP: <? $h = '192.168.128.1'; $f = $_GET['f']; if($_GET['a']) $f .= '.avi'; $fullfilename = "ftp://".$h."/".$f; $c= ftp_connect($h); if(!$c) die('Нет коннекта'); $result = ftp_login($c,$u,$p); if(!$result) die('Неверный логин'); $fsize = ftp_size($c,$f); ftp_close($c); function downloadFile($filename,$fsize, $mimetype='application/octet-stream') { // if (!file_exists($filename)) die('Файл не найден'); $from=$to=0; $cr=NULL; if (isset($_SERVER['HTTP_RANGE'])) { $range=substr($_SERVER['HTTP_RANGE'], strpos($_SERVER['HTTP_RANGE'], '=')+1); $from=strtok($range, '-'); $to=strtok('/'); if ($to>0) $to++; if ($to) $to-=$from; header('HTTP/1.1 206 Partial Content'); $cr='Content-Range: bytes ' . $from . '-' . (($to)?($to . '/' . $to+1):$fsize); } else header('HTTP/1.1 200 Ok'); $etag=md5($filename); $etag=substr($etag, 0, 8) . '-' . substr($etag, 8, 7) . '-' . substr($etag, 15, 8); header('ETag: "' . $etag . '"'); header('Accept-Ranges: bytes'); header('Content-Length: ' . ($fsize-$to+$from)); if ($cr) header($cr); header('Connection: close'); header('Content-Type: ' . $mimetype); // header('Last-Modified: ' . gmdate('r', filemtime($filename))); $f=fopen($filename, 'r'); header('Content-Disposition: attachment; filename="' . basename($filename) . '";'); if ($from) fseek($f, $from, SEEK_SET); if (!isset($to) or empty($to)) { $size=$fsize-$from; } else { $size=$to; } $downloaded=0; while(!feof($f) and !connection_status() and ($downloaded<$size)) { echo fread($f, 512000); $downloaded+=512000; flush(); } } downloadFile($fullfilename,$fsize); ?> [/code] А теперь выливаем на сервер с фостингом и в качалке пишем: [code]http://www.site.com/tunel.php?a=1&f=Video/avi/XXX и все работает! Файл качается с фтп и перенаправляется нам!
ex ключевая фраза - если пользователь прекратит закачку.. а скрипт то вроде как продолжит исполнятся..
Гы! Я лох: PHP: <? ... if ($from) fseek($f, $from, SEEK_SET); ... ?> Получается так, что оно при каждом восстановлении закачки после паузы происходит дописывания в скачевыемый файл файла с сервера, только с самого начала. Есть предложения?
Э... это как мне установить позицию seek? Палка в 2х концах: с fopen("ftp://...") не пашет fseek, а с ftp_get я ен знаю, как скачать скажем, 512000 байт, а не все до конца!