TAPAKAH2 Опубликовано 7 Ноября 2005 Жалоба Поделиться Опубликовано 7 Ноября 2005 Вот есть такой скрипт который по моим замыслам должен скачивать файл учитывая название и размер! (незнаю как выразится )Вобщем ошибка скрипта заключается в том, что у меня не определяется размер файла и во время закачки показывается только размер загруженный, весь размер файла не поуказывается! Это очень не удобно, помогите пожалуйста решить эту проблемму!<?php //В файле base.dat хранится информация о файлах! //Например: //file::0::http://site.ru/file.exe::Название файлаю..exe //где file - имя строки (http://site.ru/download.php?go=file) //0 - кол-во закачек //адрес файла //название $data="base.dat"; if(!isset($go)) exit; $base=file($data); $cnt=count($base); for($i=0;$i<$cnt;$i++) { list($id,$count,$urls,$name)=explode("::", $base[$i]); if($id==$go) { $count++; $base[$i]="$id::$count::$urls::$name"; $base_str=implode($base,""); $f=fopen($data, "w"); fwrite($f, $base_str); fclose($f); if(!isset($url)) $url = $urls; header("Content-type: application/octet-stream"); //Вот в этой строчке ошибка (после которой нет размера файла, не имени при сохранении): //header("Content-Length: ".filesize($url)); header("Content-Disposition: inline; filename=".$name); $f = fopen( $url, 'rb' ); fpassthru( $f ); fclose( $f ); exit; } } ?> Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
kovpas Опубликовано 7 Ноября 2005 Жалоба Поделиться Опубликовано 7 Ноября 2005 (изменено) проблема в том, что filesize() работает только для локальных файлов. Чтобы получить Content-Length можно воткнуть что-нить вроде этого: $path = explode( "/", $urls ); $fhost = "http://" . $path[0]; $l = 1; echo( $path[2] ); if( "http:" == $path[0] ) { $l = 2; $fhost = "http://" . $path[2]; } for ( $i = $l + 1; $i < sizeof( $path ); $i++ ) { $fname .= $path[$i] . "/"; } $fname = substr( $fname, 0, strlen( $fname ) - 1 ); $x = 0; $fp = fsockopen( $fhost, 80, &$errno, &$errstr, 30 ) or die( "!!!!" ); fputs( $fp,"HEAD $name HTTP/1.0\nHOST: $fhost\n\n" ); while( false == feof( $fp ) ) { $x .= fgets( $fp,128 ) }; fclose( $fp ); ereg( "Content-Length: ([0-9]+)", $x, $size ); соответственно, в $size будет длинна файла. К сожалению, проверить работоспособность скрипта сейчас не могу - на единственном доступном мне сервере с пхп отключена возможность использования fsockopen, но, по-идее, должно работать - серьезных ошибок я не вижу. Изменено 7 Ноября 2005 пользователем kovpas Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
TAPAKAH2 Опубликовано 8 Ноября 2005 Автор Жалоба Поделиться Опубликовано 8 Ноября 2005 Вставил в скрипт Но там ошибка, как понял я вот в этом: while( false == feof( $fp ) ) { $x .= fgets( $fp,128 ) }; И вылазит ошибка:Parse error: parse error, unexpected '}' in z:\home\cx75.ovl.ru\www\downloads\download.php on line 63 Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
kovpas Опубликовано 8 Ноября 2005 Жалоба Поделиться Опубликовано 8 Ноября 2005 (изменено) Вставил в скрипт Но там ошибка, как понял я вот в этом: while( false == feof( $fp ) ) { $x .= fgets( $fp,128 ) }; И вылазит ошибка:Parse error: parse error, unexpected '}' in z:\home\cx75.ovl.ru\www\downloads\download.php on line 63 Тьфу. Поставь точку с запятой после fgets и убери после }. Я эту конструкцию переписывал прямо во время ответа Изменено 8 Ноября 2005 пользователем kovpas Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
TAPAKAH2 Опубликовано 8 Ноября 2005 Автор Жалоба Поделиться Опубликовано 8 Ноября 2005 А ну да ! Я чёт тоже не допёр, щас проверю Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
TAPAKAH2 Опубликовано 8 Ноября 2005 Автор Жалоба Поделиться Опубликовано 8 Ноября 2005 В денвере не работает, т.к. там нет такой функции, где включить не нашёл!На хосте тоже нет, такой функции, и врятли включат А другой выход есть? Ведь всякие там форумы используют именно filsize а не такие способы! Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
kovpas Опубликовано 8 Ноября 2005 Жалоба Поделиться Опубликовано 8 Ноября 2005 (изменено) Какие форумы? Примеры давай. Опять же, вариант - ты говоришь о файлах на том же сервере, что и форум, а не об удаленных. Сейчас попробую поискать что-нить еще, но я бы не очень на это рассчитывал. -----Добавлено:Проблема в ДНС. ПХП не может их резолвить. Например, если в /etc/hosts напрямую прописать IP того хоста, к которому ты хочешь коннектиться, то все заработает. Я пробовал - помогает. В общем, больше не знаю чем помочь, если на что наткнусь - напишу. Изменено 8 Ноября 2005 пользователем kovpas Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
kovpas Опубликовано 8 Ноября 2005 Жалоба Поделиться Опубликовано 8 Ноября 2005 Только что нашел решение. Записывай: $path = explode( "/", $urls ); $fhost = "http://" . $path[0]; $l = 1; echo( $path[2] ); if( "http:" == $path[0] ) { $l = 2; $fhost = "http://" . $path[2]; } то, что выше меняй на это: $path = explode( "/", $urls ); $fhost = $path[0]; $l = 0; if( "http:" == $path[0] ) { $l = 2; $fhost = $path[2]; } Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
TAPAKAH2 Опубликовано 9 Ноября 2005 Автор Жалоба Поделиться Опубликовано 9 Ноября 2005 Тот-же самый IPB+ есть скрипты закачки файлов такие как paFileDB3 который ищет размер через filesize() и ему без разницы где находится файл! Теперь качает, но размер не показывает! (качал и раньше без всего этого)! Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
kovpas Опубликовано 9 Ноября 2005 Жалоба Поделиться Опубликовано 9 Ноября 2005 попробуй сделать echo( $size ); die();и посмотри выведет ли он размер. Если выведет - лажа у тебя. Касательно IPBи ему без разницы где находится файл!Позволь посомневаться, пока не покажешь обратного - дай кусок кода, где он берет размер удаленного файла filesize'ом. ИМХО, это протсо технически невозможно - размер должен тебе отдать удаленный сервер, а этого он не сделает, пока не откроет сокета. В общем, чего-то ты не понимаешь... Или я... Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
TAPAKAH2 Опубликовано 9 Ноября 2005 Автор Жалоба Поделиться Опубликовано 9 Ноября 2005 Скорее всего я -)Вобщем я нашёл выход! Использовал путь сервера, и сам адрес из корня до файла на сайте!+ добавить обработчик и одно поле в базу!Если 1 (файл у меня), то делать так чтоб нельзя было узнать где он лежит, если скажем 0 (файл не у меня) то мне пофиг, будут знать где он или нет, там можно просто сделать Location:... Короче огромный тебе респект, за то что откликнулся! Век не забуду! Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
kovpas Опубликовано 9 Ноября 2005 Жалоба Поделиться Опубликовано 9 Ноября 2005 Не за что. Помог чем смог . Удачи! Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.