За последние 24 часа нас посетили 16545 программистов и 1642 робота. Сейчас ищут 997 программистов ...

Файл с удаленного сервера

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

  1. Vitas

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

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    У меня есть скрипт посредник, все файлы лежат на сервере у которого нет поддержки РНР и я с помощью сокетов получаю этот файл или его часть (в зависимости от того указан ли $_SERVER ["HTTP_RANGE"]).
    Вот листинг скрипта:
    PHP:
    1. <?php
    2.  
    3. function curl ($host, $name, $range) {
    4.     $request = "GET /" . $name . " HTTP/1.1\r\n" .
    5.                "Host: " . $host . "\r\n" .
    6.                "Connection: close\r\n";
    7.     if ($range != "") {
    8.         $request .= "Range: " . $range . "\r\n";
    9.     }
    10.     $request .= "\r\n";
    11.     $headers = true;
    12.     $result = array (
    13.         "headers" => array (),
    14.         "content" => ""
    15.     );
    16.     $site = fsockopen ($host, 80);
    17.     fwrite ($site, $request);
    18.     while (!feof ($site)) {
    19.         $line = rtrim (fgets ($site));
    20.         if (!$line) {
    21.             $headers = false;
    22.             continue;
    23.         }
    24.         if ($headers) {
    25.             if (substr ($line, 0, 4) == "HTTP") {
    26.                 $result ["headers"]["Status"] = $line;
    27.             } else {
    28.                 list ($name, $value) = explode (": ", $line);
    29.                 $result ["headers"][$name] = $value;
    30.             }
    31.         } else {
    32.             $result ["content"] .= $line;
    33.         }
    34.     }
    35.     fclose ($site);
    36.     return ($result);
    37. }
    38.  
    39. if (isset ($_SERVER ["HTTP_RANGE"])) {
    40.     $range = $_SERVER ["HTTP_RANGE"];
    41. } else {
    42.     $range = "";
    43. }
    44. $result = curl ("archive.ru", "LocoRoco.bmp", $range);
    45.  
    46. header ($result ["headers"]["Status"]);
    47. header ("Content-Type: application/x-octetstream");
    48. header ("Content-Length: " . $result ["headers"]["Content-Length"]);
    49. header ("Content-Disposition: attachment; filename=\"LocoRoco.bmp\"");
    50.  
    51. if (isset ($result ["headers"]["Content-Range"])) {
    52.     header ("Content-Range: " . $result ["headers"]["Content-Range"]);
    53. }
    54.  
    55. header ("Last-Modified: " . $result ["headers"]["Last-Modified"]);
    56. header ("ETag: \"" . $result ["headers"]["ETag"] . "\"");
    57. header ("Accept-Ranges: bytes");
    58.  
    59. echo $result ["content"];
    60.  
    61. ?>
    Функция curl получает файл с удаленного сервера или его часть, и записывает все заголовки а также само содержание файла в результат в виде ассоциативного массива.
    Ну а потом я просто посылаю все нужные заголовки и печатаю результат, НО проблема в том, что этот скрипт некорректно скачивает некоторые файлы.
    В чем проблема?
     
  2. Raa

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

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    А что значит "некорректно"? Что происходит не так? Если скрипт ломает файлы, то как именно? И как воспроизвести ошибку?
     
  3. Vitas

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

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    Я качаю файлы с помощью программы FlashGet, так вот при скачке файла объемом в 1 МБ, недокачивается нексолько (кило) байт.
     
  4. Raa

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

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    По-моему у тебя rtrim() крадет пробельные символы из данных. А зачем ты вообще обрезаешь строки? Попробуй просто убрать ртрим.
     
  5. Vitas

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

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    Точно! Я как-то про это забыл. СПС.