Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> скачка в один поток 
:(
    Опции темы
admsasha
Дата 3.7.2005, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Как сделать что бы скачивать через скрипт можно было только в один поток ?
какой параметр ставиться ?
PM MAIL WWW ICQ Jabber   Вверх
korob2001
Дата 3.7.2005, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



admsasha - если у тебя есть желание, давай сегодня вечером или завтра напишем вместе то, что тебе нужно. Для подсчёта кол-ва скачиваний совсем не нужно делать один поток.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
admsasha
Дата 3.7.2005, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Цитата(korob2001 @ 3.7.2005, 17:40)
admsasha - если у тебя есть желание, давай сегодня вечером или завтра напишем вместе то, что тебе нужно. Для подсчёта кол-ва скачиваний совсем не нужно делать один поток.

при многопоточной закачки у меня сервер от httpd вешается... поэтому и хочу сделать однопоточную...


хорошо жду вечера... надеюсь все решим, если что то я просто в invisible
PM MAIL WWW ICQ Jabber   Вверх
korob2001
Дата 4.7.2005, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Привет, вобщем написал тут такую программу, она кончечно же не совсем то, что тебе нужно, но очень похожа. Делает он следующее:
1. Генерирует форму для добавления ссылки.
2. На странице с формой, выводит все ссылки.
3. Отслеживает и считает кол-во кликов, а так же отслеживает что бы количество переходов по ссылке не привышало то, которое указано в базе данных, в качестве максимального. Если же ссылку нужно показывать бесконечно, нужно установить значение максимально допустимых кликов в 0, если же установлена другая цифра, то как только счётчик дойдёт до этого числа, то эту ссылку программа показывать больше не будет.

Если добавить в эту программу проверку данны, полученных от пользователя, так же оптимизировать SQL запросы, и написать программу которая будет запускаться время от времени и удалять те ссылки, которые уже показаны нужное число раз, а так же отдельный вход для админа ( с исчезающей дверью smile ), то её можно считать законченным приложением. Можно конечно ещё добавить чего-нить, но это уже навороты, которые добавить каждый в праве.

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

Теперь о коде, для начала выполни такой SQL запрос:
Код

CREATE TABLE IF NOT EXISTS Links (
Id         MEDIUMINT    NOT NULL     AUTO_INCREMENT,
Title      VARCHAR(250) NOT NULL,
Link       VARCHAR(150) NOT NULL,
MaxClick   INT          NOT NULL,
Clicked    INT          NOT NULL,
PRIMARY KEY( Id ),
INDEX( Title )
);

Теперь просто сохрани этот код в файл с любым именем, лишь бы расширение было как у выполняемого файла, обычно .cgi, .pl, в каталог cgi-bin/.
Код

#!/usr/bin/perl
use strict;
use CGI;
use DBI;
my $cgi = new CGI;

my $HOST = "тута_твой_хост";
my $BASE = "LinkCounter";
my $LOG  = "твой логин";
my $PASS = "твой пароль";


my $dbh = DBI->connect("DBI:mysql:host=$HOST;database=$BASE", $LOG, $PASS,
                        { PrintError => 1, RaiseError => 0 } );

sub show_form {
    my $fields = [ { label => 'Заголовок ссылки',     size  => 35, name  => 'title' },
                   { label => 'Ссылка',               size  => 35, name  => 'link' },
                   { label => 'Максимум скачиваний:', size  => 10, name  => 'maxclick' } ];
    print $cgi->start_html( -title => 'Добавление ссылки' );
    print $cgi->start_form( -action => $cgi->url( -relative => 1 ) );
    print $cgi->start_table( { -width       => 500,
                               -border      => 1,
                               -cellspacing => 3,
                               -cellpadding => 5 } );
         print $cgi->start_Tr();
              print $cgi->start_td( { -width   => 500,
                                      -align   => 'center',
                                      -colspan => 2 } );
                   print $cgi->b( { -style => 'font-size: 15px' }, "Добавление ссылки" );
              print $cgi->end_td();
         print $cgi->end_Tr();

         for my $field ( @$fields ) {
             print $cgi->start_Tr();
                  print $cgi->start_td( { -width => 200,
                                          -align => 'right' } );
                       print $cgi->b( { -style => 'font-size: 11px' }, $field->{ label } );
                  print $cgi->end_td();
                  print $cgi->start_td( { -width => 300,
                                          -align => 'left' } );
                       print $cgi->textfield( -name  => $field->{ name },
                                              -size  => $field->{ size },
                                              -style => 'font-size: 11px; font-weight: bold' );
                  print $cgi->end_td();
             print $cgi->end_Tr();
         }

         print $cgi->start_Tr();
              print $cgi->start_td( { -width   => 500,
                                      -align   => 'center',
                                      -colspan => 2 } );
                   print $cgi->submit( -name  => 'add',
                                       -value => 'Добавить' );
              print $cgi->end_td();
         print $cgi->end_Tr();
    print $cgi->end_table();
    print $cgi->br() x 2;
    print $cgi->hr();
    my( $sth, $sql ) = ();
    $sql = "SELECT * FROM Links WHERE MaxClick='0' OR Clicked < MaxClick ORDER BY Title DESC";
    $sth = $dbh->prepare( $sql );
    my $res = $sth->execute();
    if ( ( $res += 0 ) > 0 ) {
           while ( my $href = $sth->fetchrow_hashref() ) {
                   print "<nobr>";
                   print $cgi->a( { -href   => $cgi->url( -relative => 1 ) . "?id=" . $href->{ Id },
                                    -target => '_blank' }, $href->{ Title } );
                   print $cgi->font( { -style => 'color: #aa0000; font-size: 12px' }, " [" . $href->{ Clicked } . "] [" . $href->{ MaxClick } . "]" );
                   print "</nobr>";
                   print $cgi->br();
           }
    } else {
           print $cgi->b( { -style => 'font-size: 16px' }, "Нет ссылок в базе данных" );
    }
    $sth->finish();
    print $cgi->end_form();
    print $cgi->end_html();
}

sub add_link {
    my $title    = $cgi->param('title');
    my $link     = $cgi->param('link');
    my $maxclick = $cgi->param('maxclick');
    # Тута проверяем данные, я этого делать не буду

    my $sql =  "INSERT INTO Links ( Title, Link, MaxClick, Clicked ) VALUES ( '$title', '$link', '$maxclick', '0' )";
    $dbh->do( $sql );
}

sub link_increment {
    my $id = $cgi->param('id');
    # Здесь проверяем полученный параметр, это сделай сам

    my $sql = "UPDATE Links SET Clicked = Clicked + 1 WHERE Id='$id' LIMIT 1";
    $dbh->do( $sql );
    $sql = "SELECT Link FROM Links WHERE Id='$id' LIMIT 1";
    my $sth = $dbh->prepare( $sql );
    $sth->execute();
    my( $url ) = $sth->fetchrow_array();
    $sth->finish();
    print $cgi->redirect( -uri => $url );
}

if ( defined $cgi->param('add') ) {
     print $cgi->header( -charset => 'Windows-1251' );
     add_link();
     show_form();
} elsif ( defined $cgi->param('id') ) {
     link_increment();
} else {
     print $cgi->header( -charset => 'Windows-1251' );
     show_form();
}

$dbh->disconnect();

Enjoy ;))))

ЗЫ: проверки полученных данных и админки здесь нет, соответственно пока вы этого не сделаете, не стоит выкладывать её в глобальную сеть, иначе будете наблюдать на своём сайте надпись типа: Hacked by nE05idE71Fdl smile

Удачи.

Это сообщение отредактировал(а) korob2001 - 4.7.2005, 20:42


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
admsasha
Дата 5.7.2005, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Цитата(korob2001 @ 5.7.2005, 03:39)
print $cgi->redirect( -uri => $url );


Как я понимаю это редирект на файл ?
а что мне мешает, узнать полный путь к файлу, и качать без ограничений ?
PM MAIL WWW ICQ Jabber   Вверх
korob2001
Дата 5.7.2005, 04:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



А ты пробовал?? Если да, то как??? smile Ну и ещё можно убрать target или установить его в _self, хотя это и не нужно.

Это сообщение отредактировал(а) korob2001 - 5.7.2005, 04:39


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
admsasha
Дата 5.7.2005, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Цитата(korob2001 @ 5.7.2005, 11:32)
А ты пробовал?? Если да, то как???  Ну и ещё можно убрать target или установить его в _self, хотя это и не нужно.

во всем этом и заключается проблема

скрипт назвал load.cgi, качаю файл через ReGet
Цитата
ReGet Deluxe 4.0 (build 210)
Output 4 21:42:39 5.7.2005 GET /cgi-bin/filesunload/load.cgi HTTP/1.0
Output 4  User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)
Output 4  Cookie: sess_lang=russian
Output 4  Accept: */*
Output 4  Referer: http://192.168.200.1/cgi-bin/filesunload/
Output 4  Host: 192.168.200.1

Input 5 21:42:39 5.7.2005 HTTP/1.1 302 Moved
Input 5  Date: Tue, 05 Jul 2005 11:57:19 GMT
Input 5  Server: Apache-AdvancedExtranetServer/2.0.48 (Mandrake Linux/6mdk) mod_perl/1.99_11 Perl/v5.8.3 mod_auth_external/2.2.7 auth_mysql/1.11 mod_auth_pgsql/2.0.1 auth_radius/1.7PR1 mod_layout/4.0.1a mod_ssl/2.0.48 OpenSSL/0.9.7c DAV/2 PHP/4.3.4 mod_auth_remote/1.0 mod_auth_shadow/2.0
Input 5  Location: unload/file227392214.rar
Input 5  Content-Length: 0
Input 5  Connection: close
Input 5  Content-Type: application/x-cgi

Info 6 21:42:39 5.7.2005 Соединяемся с 192.168.200.1 (192.168.200.1:80)

Output 7 21:42:39 5.7.2005 GET /cgi-bin/filesunload/unload/file227392214.rar HTTP/1.0
Output 7  User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)
Output 7  Cookie: sess_lang=russian
Output 7  Accept: */*
Output 7  Referer: http://192.168.200.1/cgi-bin/filesunload/
Output 7  Host: 192.168.200.1


PM MAIL WWW ICQ Jabber   Вверх
korob2001
Дата 5.7.2005, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Странно, а у меня вот, что пишет.

Код

ReGet Deluxe 4.1a (build 249)
Info    1    19:53:49    5.7.2005    ==================================================
Info    1            | ReGet Deluxe 4.1a (build 249) started
Info    1            ==================================================
Info    2    19:58:26    5.7.2005    Начинаем закачку - http://localhost/cgi-bin/LinkCounter/linkcount.pl?id=8
Info    3    19:58:26    5.7.2005    Закачка завершена - http://localhost/cgi-bin/LinkCounter/linkcount.pl?id=8


Ты как путь указываешь???

Это сообщение отредактировал(а) korob2001 - 5.7.2005, 21:02


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
admsasha
Дата 6.7.2005, 03:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Цитата(korob2001 @ 6.7.2005, 04:00)
Ты как путь указываешь???

$url="unload/file227392214.rar";

PM MAIL WWW ICQ Jabber   Вверх
korob2001
Дата 6.7.2005, 04:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Попробуй так:
Создай в каталоге /www, каталог soft/, т.е. /www/soft/. В него кинь свой файл.
запусти скрипт и заполни поля, например:

Заголовок ссылки: Мой файл
Ссылка: http://localhost/soft/file227392214.rar
Максимум скачиваний: 10

После жми кнопку ДОБАВИТЬ.

Затем жми на ссылку, которую ты хочешь скачать, если ты качаешь файл через свою программу, вот и указывай путь к Perl файлу, код которого я выложил, т.е.
http://localhost/cgi-bin/linkcounter.pl?id=1

Это сообщение отредактировал(а) korob2001 - 6.7.2005, 04:51


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
admsasha
Дата 6.7.2005, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Скрипт твой, данные точно такие какие ты сказал.


вот полный лог ReGet, без вырезок.
Цитата
ReGet Deluxe 4.1 (build 241)
Status 1 14:27:28 6.7.2005 Состояние закачки - [Ожидание в очереди]
Info 2 14:27:28 6.7.2005 Еще одна секция запущена
Info 3 14:27:28 6.7.2005 Соединяемся с 192.168.200.1 (192.168.200.1:80)
Output 4 14:27:28 6.7.2005 GET /cgi-bin/filesunload/load.cgi?id=1 HTTP/1.0
Output 4  User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)
Output 4  Cookie: sess_lang=russian; collapseprefs=ct,t
Output 4  Accept: */*
Output 4  Referer: http://192.168.200.1/cgi-bin/filesunload/load.cgi
Output 4  Host: 192.168.200.1
Input 5 14:27:28 6.7.2005 HTTP/1.1 302 Moved
Input 5  Date: Wed, 06 Jul 2005 04:42:04 GMT
Input 5  Server: Apache-AdvancedExtranetServer/2.0.48 (Mandrake Linux/6mdk) mod_perl/1.99_11 Perl/v5.8.3 mod_auth_external/2.2.7 auth_mysql/1.11 mod_auth_pgsql/2.0.1 auth_radius/1.7PR1 mod_layout/4.0.1a mod_ssl/2.0.48 OpenSSL/0.9.7c DAV/2 PHP/4.3.4 mod_auth_remote/1.0 mod_auth_shadow/2.0
Input 5  Location: http://192.168.200.1/soft/file227392214.rar
Input 5  Content-Length: 0
Input 5  Connection: close
Input 5  Content-Type: application/x-cgi
Info 6 14:27:28 6.7.2005 Соединяемся с 192.168.200.1 (192.168.200.1:80)
Output 7 14:27:28 6.7.2005 GET /soft/file227392214.rar HTTP/1.0
Output 7  User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)
Output 7  Cookie: sess_lang=russian; collapseprefs=ct,t
Output 7  Accept: */*
Output 7  Referer: http://192.168.200.1/cgi-bin/filesunload/load.cgi
Output 7  Host: 192.168.200.1
Input 8 14:27:28 6.7.2005 HTTP/1.1 200 OK
Input 8  Date: Wed, 06 Jul 2005 04:42:04 GMT
Input 8  Server: Apache-AdvancedExtranetServer/2.0.48 (Mandrake Linux/6mdk) mod_perl/1.99_11 Perl/v5.8.3 mod_auth_external/2.2.7 auth_mysql/1.11 mod_auth_pgsql/2.0.1 auth_radius/1.7PR1 mod_layout/4.0.1a mod_ssl/2.0.48 OpenSSL/0.9.7c DAV/2 PHP/4.3.4 mod_auth_remote/1.0 mod_auth_shadow/2.0
Input 8  ETag: "9fca5-54bd-14170740"
Input 8  Accept-Ranges: bytes
Input 8  Last-Modified: Fri, 01 Jul 2005 17:37:57 GMT
Input 8  Content-Length: 21693
Input 8  Content-Type: text/plain
Input 8  Age: 9
Input 8  Connection: close
Status 9 14:27:28 6.7.2005 Состояние закачки - [Закачка]
Info 10 14:27:28 6.7.2005 Секция скачана
Status 11 14:27:28 6.7.2005 Состояние закачки - [Закачано]



P.S. не могу не как поймать тебя в ICQ
PM MAIL WWW ICQ Jabber   Вверх
admsasha
Дата 6.7.2005, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



вообщем попробывыл lock, блокировки неправильно снимаются, и всё равно (но это смотреть код надо внимательнее) качает в несколько секций.


выход нашел только один
if(exists($ENV{'HTTP_RANGE'})){exit;}

минусы - нет подержки докачки.

можно конечно перед каждым выводом буфера ставить в базу метку, что-то типа пинга.
т.е. вывел 1024 байт, поставил пинг в базе
а выше указать, если последнее время пинга < 10 секунд, то закрыть, и не дать качать.

но мне кажется что будет сильно из-за этого тормозить систему
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0811 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.