За последние 24 часа нас посетили 17320 программистов и 1204 робота. Сейчас ищут 1346 программистов ...

php перенаправление

Тема в разделе "Прочие вопросы по PHP", создана пользователем ex, 19 дек 2006.

  1. ex

    ex Активный пользователь

    С нами с:
    10 ноя 2006
    Сообщения:
    16
    Симпатии:
    0
    Ситуация такая:
    У нас на сервере ограничение на скачивание avi файлов.
    У меня есть доступ к нескольким хостингам.
    Задача такая: как организовать php тунель для скачивания файлов, изменив им расширение.

    P.S. Вот, например, на Зайцев.нет можно скачивать файлы с расширением rar, exe... вряд ли они хранят все файлы с разными вариантами расширений. Но как же они, тогда это делают?
     
  2. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
  3. Бутузов

    Бутузов Активный пользователь

    С нами с:
    5 фев 2006
    Сообщения:
    115
    Симпатии:
    0
    Адрес:
    Київ, Україна
  4. ex

    ex Активный пользователь

    С нами с:
    10 ноя 2006
    Сообщения:
    16
    Симпатии:
    0
    Все немного сложнее... нужно подконнектится к FTP(не проблема) и взять оттуда файл(не проблема), потом, заменив его расширение выдать его через HTTP. Хорошо бы, если бы была возможность докачки. И нужно учесть ограниченость пространства хостинга.
     
  5. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    нисколько.
    вы по первой ссылке в поиск ходили? первый же результат поиска - пример для вас. вам остается подкорректировать всего пару строк.
     
  6. ex

    ex Активный пользователь

    С нами с:
    10 ноя 2006
    Сообщения:
    16
    Симпатии:
    0
    Ну не знаю...
    Код (Text):
    1.     while(!feof($f) and !connection_status() and ($downloaded<$size))
    2.     {
    3.         echo fread($f, 512000);
    4.         $downloaded+=512000;
    5.         flush();
    6.     }
    тут, насколько я понимаю, оно качает часть файла. А как скачать часть файла с ftp?
     
  7. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    функция fopen умеет работать не только с локальными файлами, но и через ftp и http.
     
  8. Davil

    Davil Guest

    А что, если на фтп, то это уже не файл?
     
  9. NaRuVi

    NaRuVi Активный пользователь

    С нами с:
    14 дек 2006
    Сообщения:
    80
    Симпатии:
    0
    Адрес:
    Москва
    Очевидно Ex имел в ввиду что файл может закачиваться непосредственно через FTP? Тогда PHP тут не поможет
     
  10. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    NaRuVi, куда закачиваться? ни о каком "закачивании" речи не шло.
     
  11. ex

    ex Активный пользователь

    С нами с:
    10 ноя 2006
    Сообщения:
    16
    Симпатии:
    0
    Все, я разбуплился... все работает:
    PHP:
    1.  
    2. <?
    3. $h = '192.168.128.1';
    4. $f = $_GET['f'];
    5. if($_GET['a']) $f .= '.avi';
    6. $fullfilename = "ftp://".$h."/".$f;
    7.  
    8. $c= ftp_connect($h);
    9. if(!$c) die('Нет коннекта');
    10. $result = ftp_login($c,$u,$p);
    11. if(!$result) die('Неверный логин');
    12. $fsize = ftp_size($c,$f);
    13.  
    14. function downloadFile($filename,$fsize, $mimetype='application/octet-stream')
    15. {
    16. //  if (!file_exists($filename)) die('Файл не найден');
    17.     $from=$to=0; $cr=NULL;
    18.     if (isset($_SERVER['HTTP_RANGE']))
    19.     {
    20.         $range=substr($_SERVER['HTTP_RANGE'], strpos($_SERVER['HTTP_RANGE'], '=')+1);
    21.         $from=strtok($range, '-');
    22.         $to=strtok('/');
    23.         if ($to>0) $to++;
    24.         if ($to) $to-=$from;
    25.         header('HTTP/1.1 206 Partial Content');
    26.         $cr='Content-Range: bytes ' . $from . '-' . (($to)?($to . '/' . $to+1):$fsize);
    27.     } else  header('HTTP/1.1 200 Ok');
    28.     $etag=md5($filename);
    29.     $etag=substr($etag, 0, 8) . '-' . substr($etag, 8, 7) . '-' . substr($etag, 15, 8);
    30.     header('ETag: "' . $etag . '"');
    31.     header('Accept-Ranges: bytes');
    32.     header('Content-Length: ' . ($fsize-$to+$from));
    33.     if ($cr) header($cr);
    34.     header('Connection: close');
    35.     header('Content-Type: ' . $mimetype);
    36. //  header('Last-Modified: ' . gmdate('r', filemtime($filename)));
    37.     $f=fopen($filename, 'r');
    38.     header('Content-Disposition: attachment; filename="' . basename($filename) . '";');
    39.     if ($from) fseek($f, $from, SEEK_SET);
    40.     if (!isset($to) or empty($to))
    41.     {
    42.     $size=$fsize-$from;
    43.     }
    44.     else
    45.     {
    46.     $size=$to;
    47.     }
    48.     $downloaded=0;
    49.     while(!feof($f) and !connection_status() and ($downloaded<$size))
    50.     {
    51.         echo fread($f, 512000);
    52.         $downloaded+=512000;
    53.         flush();
    54.     }
    55. }
    56. downloadFile($fullfilename,$fsize);
    57. ?>
    58. [/code]
    59.  
    60. А теперь выливаем на сервер с фостингом и в качалке пишем:
    61.  
    62. [code]http://www.site.com/tunel.php?a=1&f=Video/avi/XXX
    и все работает! Файл качается с фтп и перенаправляется нам!
     
  12. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    а если файл - мегабайт на 700? и пользователь отменил загрузку?

    и если пользователей будет несколько
     
  13. ex

    ex Активный пользователь

    С нами с:
    10 ноя 2006
    Сообщения:
    16
    Симпатии:
    0
    И что? Я сейчас качаю фильм через этот тунель на 1400 метров и нормально...
     
  14. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    ex

    ключевая фраза - если пользователь прекратит закачку.. а скрипт то вроде как продолжит исполнятся..
     
  15. ex

    ex Активный пользователь

    С нами с:
    10 ноя 2006
    Сообщения:
    16
    Симпатии:
    0
    PHP:
    1.  
    2. while(... !connection_status() ...)
    3.  
    А это разве не поможет?
     
  16. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    ex

    да, поможет, только эта функция возвращает int, а не bool значение
     
  17. Mavir

    Mavir Guest

    И что с того, что int?
     
  18. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Mavir

    она должна что-то вернуть.. и это что-то - не false
     
  19. Mavir

    Mavir Guest

  20. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    0 - NORMAL
    1 - ABORTED
    2 - TIMEOUT

    ага, и вернется целое ненулевое значение
     
  21. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    DarkElf
    PHP:
    1. <?php
    2. $a = !0;
    3. $b = !1;
    4. $c = !2;
    5. var_dump($a, $b, $c);
    6. ?>
     
  22. ex

    ex Активный пользователь

    С нами с:
    10 ноя 2006
    Сообщения:
    16
    Симпатии:
    0
    Гы! Я лох:
    PHP:
    1. <?
    2. ...
    3.     if ($from) fseek($f, $from, SEEK_SET);
    4. ...
    5. ?>
    Получается так, что оно при каждом восстановлении закачки после паузы происходит дописывания в скачевыемый файл файла с сервера, только с самого начала.

    Есть предложения?
     
  23. Mavir

    Mavir Guest

    Делать докачку, например, как во FlashGet через сокет или cURL.
     
  24. ex

    ex Активный пользователь

    С нами с:
    10 ноя 2006
    Сообщения:
    16
    Симпатии:
    0
    Э... это как мне установить позицию seek?
    Палка в 2х концах: с fopen("ftp://...") не пашет fseek,
    а с ftp_get я ен знаю, как скачать скажем, 512000 байт, а не все до конца!