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

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


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

Вот есть такой скрипт который по моим замыслам должен скачивать файл учитывая название и размер! (незнаю как выразится :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:...

 

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

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

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

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

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

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

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

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

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

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