У меня есть скрипт посредник, все файлы лежат на сервере у которого нет поддержки РНР и я с помощью сокетов получаю этот файл или его часть (в зависимости от того указан ли $_SERVER ["HTTP_RANGE"]). Вот листинг скрипта: PHP: <?php function curl ($host, $name, $range) { $request = "GET /" . $name . " HTTP/1.1\r\n" . "Host: " . $host . "\r\n" . "Connection: close\r\n"; if ($range != "") { $request .= "Range: " . $range . "\r\n"; } $request .= "\r\n"; $headers = true; $result = array ( "headers" => array (), "content" => "" ); $site = fsockopen ($host, 80); fwrite ($site, $request); while (!feof ($site)) { $line = rtrim (fgets ($site)); if (!$line) { $headers = false; continue; } if ($headers) { if (substr ($line, 0, 4) == "HTTP") { $result ["headers"]["Status"] = $line; } else { list ($name, $value) = explode (": ", $line); $result ["headers"][$name] = $value; } } else { $result ["content"] .= $line; } } fclose ($site); return ($result); } if (isset ($_SERVER ["HTTP_RANGE"])) { $range = $_SERVER ["HTTP_RANGE"]; } else { $range = ""; } $result = curl ("archive.ru", "LocoRoco.bmp", $range); header ($result ["headers"]["Status"]); header ("Content-Type: application/x-octetstream"); header ("Content-Length: " . $result ["headers"]["Content-Length"]); header ("Content-Disposition: attachment; filename=\"LocoRoco.bmp\""); if (isset ($result ["headers"]["Content-Range"])) { header ("Content-Range: " . $result ["headers"]["Content-Range"]); } header ("Last-Modified: " . $result ["headers"]["Last-Modified"]); header ("ETag: \"" . $result ["headers"]["ETag"] . "\""); header ("Accept-Ranges: bytes"); echo $result ["content"]; ?> Функция curl получает файл с удаленного сервера или его часть, и записывает все заголовки а также само содержание файла в результат в виде ассоциативного массива. Ну а потом я просто посылаю все нужные заголовки и печатаю результат, НО проблема в том, что этот скрипт некорректно скачивает некоторые файлы. В чем проблема?
А что значит "некорректно"? Что происходит не так? Если скрипт ломает файлы, то как именно? И как воспроизвести ошибку?
Я качаю файлы с помощью программы FlashGet, так вот при скачке файла объемом в 1 МБ, недокачивается нексолько (кило) байт.
По-моему у тебя rtrim() крадет пробельные символы из данных. А зачем ты вообще обрезаешь строки? Попробуй просто убрать ртрим.