Перейти к контенту

Помогите плиз со скриптом закачки файлов!


Рекомендуемые сообщения

Вот есть такой скрипт который по моим замыслам должен скачивать файл учитывая название и размер! (незнаю как выразится :D )

Вобщем ошибка скрипта заключается в том, что у меня не определяется размер файла и во время закачки показывается только размер загруженный, весь размер файла не поуказывается! Это очень не удобно, помогите пожалуйста решить эту проблемму!

<?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;

         }

    }

?>

Ссылка на комментарий
Поделиться на других сайтах

проблема в том, что 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, но, по-идее, должно работать - серьезных ошибок я не вижу.

Изменено пользователем kovpas
Ссылка на комментарий
Поделиться на других сайтах

Вставил в скрипт

 

Но там ошибка, как понял я вот в этом:

 

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

Ссылка на комментарий
Поделиться на других сайтах

Вставил в скрипт

 

Но там ошибка, как понял я вот в этом:

 

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 и убери после }. Я эту конструкцию переписывал прямо во время ответа :D

 

;)

Изменено пользователем kovpas
Ссылка на комментарий
Поделиться на других сайтах

В денвере не работает, т.к. там нет такой функции, где включить не нашёл!

На хосте тоже нет, такой функции, и врятли включат :D

 

А другой выход есть? Ведь всякие там форумы используют именно filsize а не такие способы!

Ссылка на комментарий
Поделиться на других сайтах

Какие форумы? Примеры давай. Опять же, вариант - ты говоришь о файлах на том же сервере, что и форум, а не об удаленных.

 

Сейчас попробую поискать что-нить еще, но я бы не очень на это рассчитывал.

 

-----

Добавлено:

Проблема в ДНС. ПХП не может их резолвить. Например, если в /etc/hosts напрямую прописать IP того хоста, к которому ты хочешь коннектиться, то все заработает. Я пробовал - помогает.

 

В общем, больше не знаю чем помочь, если на что наткнусь - напишу.

Изменено пользователем kovpas
Ссылка на комментарий
Поделиться на других сайтах

Только что нашел решение.

 

Записывай:

 

$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];
}

Ссылка на комментарий
Поделиться на других сайтах

Тот-же самый IPB

+ есть скрипты закачки файлов такие как paFileDB3 который ищет размер через filesize() и ему без разницы где находится файл!

 

Теперь качает, но размер не показывает! (качал и раньше без всего этого)!

Ссылка на комментарий
Поделиться на других сайтах

попробуй сделать

echo( $size );
die();

и посмотри выведет ли он размер. Если выведет - лажа у тебя.

 

Касательно IPB

и ему без разницы где находится файл!

Позволь посомневаться, пока не покажешь обратного - дай кусок кода, где он берет размер удаленного файла filesize'ом. ИМХО, это протсо технически невозможно - размер должен тебе отдать удаленный сервер, а этого он не сделает, пока не откроет сокета.

 

В общем, чего-то ты не понимаешь... Или я...

Ссылка на комментарий
Поделиться на других сайтах

Скорее всего я -)

Вобщем я нашёл выход! Использовал путь сервера, и сам адрес из корня до файла на сайте!

+ добавить обработчик и одно поле в базу!

Если 1 (файл у меня), то делать так чтоб нельзя было узнать где он лежит, если скажем 0 (файл не у меня) то мне пофиг, будут знать где он или нет, там можно просто сделать Location:...

 

Короче огромный тебе респект, за то что откликнулся! Век не забуду!

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.