Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Бьются файлы при закачки с сервера


Автор: shootnix 22.5.2008, 17:44
Приветствую. Проблема, похоже, мистическая smile
Суть: на сервере имеется хранилище файлов, все они — zip-архивы. Пользователь скачивает любой файл, который захочет, через скрипт. Иными словами, существует скрипт, который все эти файлы раздает. 
На входе zip-ы целые, открываются, распаковываются. На выходе, при сохранении скачанного файла, происходит следующее: архив выглядит вполне целым, весит столько же и содержит ту же структуру. Однако, при попытке его распаковать, архиватор ругается на неожиданный конец архива. То есть, файл каким-то каком или недокачивается, или перекачивается (добавляются левые символы?)
Вот код Perl, с помощью которого отдаю файл пользователю:
Код

print "Content-Disposition: attachment; filename=$file-{name}\n";
print "Content-Length: $file->{size}\n";
print "Content-Type: application/x-force-download; name=\"$file->{name}\"\n\n";

open my $fd, "files/$file->{descriptor}.zip";
binmode( $fd );
print while( <$fd> );
close $fd;

Ткните носом, плиз, очень нужно!

Добавлено через 2 минуты и 11 секунд
Да, забыл добавить, что binmode( $fd ) уже пробовал убрать, но проблему это не решило. 

Автор: ginnie 22.5.2008, 17:52
shootnix, советую сделать diff на пару файлов, чтобы узнать, в чем они не совпадают.

Может еще попробовать binmode(STDOUT)?

Автор: KSURi 22.5.2008, 17:59
Попробуйте заменить 
Цитата(shootnix @  22.5.2008,  17:44 Найти цитируемый пост)
Код
binmode( $fd );

на
Код

binmode STDOUT


Добавлено через 14 секунд
опоздал)

Автор: shootnix 22.5.2008, 18:06
Попробовал. Ничего существенного не изменилось. Только тормозить стал.
Недокачивается последние несколько байт файла, может, даже последний байт вообще. В остальном, файлы идентичные. 
На сервере тоже граблей не обнаружено, запускал на локальном под Виндовз и на удаленном под Линукс.

Автор: ginnie 22.5.2008, 18:34
shootnix, я бы сделал следующее:

Код

my $output = '';
while(<$fd>) {
    $output .= $_;
}
warn $file->{size},' : ', length($output);
print $output;


если размер совпадает, дело явно не в скрипте.

Добавлено через 9 минут и 20 секунд
В бинарный режим надо переводить оба потока:
Код

binmode($fd);
binmode(STDOUT);

Автор: shootnix 22.5.2008, 19:28
Точно smile Оба потока! Спасибо, все работает smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)