Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

download with PERL

2.9K
06 мая 2003 года
daner
14 / / 13.04.2003
Есть несколько zip и ехе файлов (пример: 1.zip, 1.ехе, 2.zip, 2.ехе ...).
Нужно написать get.pl так что бы можно было скачивать эти файлы так:
пример для 1.zip
server.ru/get.pl?f=1&t=zip

этот скрипт не работает. Сервер добавляет HTTP заголовок и байти просто печатаются на экране
=========================
#!/usr/bin/perl
use CGI;
my $q = new CGI;
$f=$q->param("f");
$t=$q->param("t");
if(!(-f "$f.$t"))
{
print "Content-Type: text/html\n\n file not exist";
}
else
{
open(F,"<$f.$t");
print <F>;
close(F);
}
============================
300
06 мая 2003 года
ReDrum
689 / / 20.04.2000
Ясен красен, типа кокой заголовок выдаешь ;), то и получаешь.
типа смотри в сторону Content-type: octet-stream
да и binmode на STDOUT немешало бы поставить
283
06 мая 2003 года
Alone
910 / / 20.11.2002
#!/usr/bin/perl
print "Content-Type: application/octet-stream\nContent-Length: ", -s 'img.zip' ,"\n";
print "Content-Disposition: attachment; filename=img.zip\n\n";
open (fil,"<img.zip") or print "$!";
while (<fil>)
{
print $_;
}
close (fil);
2.9K
06 мая 2003 года
daner
14 / / 13.04.2003
Спосибо!!!
2.9K
07 мая 2003 года
daner
14 / / 13.04.2003
Использую этот скрипт он ПОЧТИ работает, но почему то не передается знак переноса строки. Т.е. если файл содержал:
line1
line2
line3
то результат будет:
line1line2line3
Как это исправить? И почему это происходит?
==============================================
print "Content-Type: application/octet-stream\n";
print "Content-Length: ", -s "$dir/$file" ,"\n";
print "Content-Disposition: attachment; ";
print "FileName=$file\n\n";
open(F,"<$dir/$file");
binmode(STDOUT);
while(<F>)
{
print;
}
close(F);
==============================================
300
07 мая 2003 года
ReDrum
689 / / 20.04.2000
так чего надо скачивать текстовые файлы, или бинарники???

In other words: Regardless of platform, use binmode() on binary files, and do not use binmode() on text files.

The operating system, device drivers, C libraries, and Perl run-time system all work together to let the programmer treat a single character (\n) as the line terminator, irrespective of the external representation. On many operating systems, the native text file representation matches the internal representation, but on some platforms the external representation of \n is made up of more than one character.

Mac OS and all variants of Unix use a single character to end each line in the external representation of text (even though that single character is not necessarily the same across these platforms). Consequently binmode() has no effect on these operating systems. In other systems like VMS, MS-DOS and the various flavors of MS-Windows your program sees a \n as a simple \cJ, but what's stored in text files are the two characters \cM\cJ. That means that, if you don't use binmode() on these systems, \cM\cJ sequences on disk will be converted to \n on input, and any \n in your program will be converted back to \cM\cJ on output. This is what you want for text files, but it can be disastrous for binary files.
2.9K
07 мая 2003 года
daner
14 / / 13.04.2003
Нужно передовать любые файлы как они есть!!! Т.е. в бинарном представлении. Дело в том что даже когда я убираю binmode всеравно \n не передается. Но сам по себе перенос меня не интересует, мне важнее что после скачки .зип файлы не открываются
283
07 мая 2003 года
Alone
910 / / 20.11.2002
ОС сервера с которого ты сливаеш файлы?
В каком режиме закачиваеш туда?
Каким редактором просматриваеш?
300
07 мая 2003 года
ReDrum
689 / / 20.04.2000
Вот кусок кода который я лобал для e-russiajournal.com. Он вроде работает, но если какие замечания возникнут, то милости просим ;)=


Код:
sub out_file {
    my $self = shift;
    my $path = shift;
    my $file = shift;
    return 0 if (!$file);

    my $size = (-s $path.$file);
    print "Content-Type: application/force-download\nContent-Disposition: attachment\;filename=\"$file\"\nContent-Length: $size\n\n";
    select STDOUT;
    $| = 1;
    open (FILE, $path.$file) || die "Can't open file!!!";
    binmode (FILE);
    my $blocksize = (stat FILE)[11] || 16384;
    my $buffer;  
    while (my $len = sysread FILE, $buffer, $blocksize) {
        if (!defined $len) {
            next if $! =~ /^Interrupted/;
            exit 0;
        }
        my $offset = 0;
        while ($len) {
            my $written = syswrite STDOUT, $buffer, $len, $offset;
            if (!defined($written)) {
               exit 0;
            }
            $len -= $written;
            $offset += $written;
        }
    }

    $| = 1;
    close FILE;
    close STDOUT;
    exit 0;
}
2.9K
07 мая 2003 года
daner
14 / / 13.04.2003
Цитата:
Originally posted by Alone
ОС сервера с которого ты сливаеш файлы?
В каком режиме закачиваеш туда?
Каким редактором просматриваеш?


пока что сайт в процессе разработки, так что закачиваю устанавливаю и создаю я на одной и тойже системе на одном и том же компютере одними и темиже редакторами
(OS: WindowsXP, server: IIS 5, Perl: ActivePerl 5, text editor: NOTEPAD, Zip arhvator: Zip viewer (build-in windowsXP)
-------------------
За код спосибо, попробую его адаптировать под свои нужды, но мне не мение интересна причина почему мой скрипт не работал корректно. Может кто может объяснить мне.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог