PERL CGI: дескриптор файла, который использует как двоичный, так и текстовый режим - PullRequest
1 голос
/ 04 июня 2011

У меня есть Perl-программа, которая пишет приложение / zip-документ с двоичными данными. Я могу сделать следующий код в моем скрипте CGI.

print $cgi->header(-type=>"application/x-zip; name=\"$filename.zip\"", -content_disposition=> "attachment; filename=\"$filename.zip\""). "\n";
print $result

где $result - двоичные данные. Затем будет выведена страница, которая предлагает пользователю скачать zip

Что я хочу сделать, так это передать всю «веб-страницу» в качестве параметра формы, поэтому я сделал это:

open $resultfh, ">", \$output_buffer or die "could not open buffer";
print $resultfh $cgi->header(-type=>"application/x-zip; name=\"$filename.zip\"", -content_disposition=> "attachment; filename=\"$filename.zip\""). "\n";
print $resultfh $result

и тогда я могу передать $output_buffer как переменную.

Проблема в том, что это не работает, что-то кажется пропущенным, потому что мне предлагают загрузить zipfile, но zipfile поврежден, я получаю несоответствие между ожидаемыми байтами и фактические байты или что-то.

Я думаю это связано с тем, что выходной буфер не находится в двоичном режиме, но я не могу прочитать заголовок содержимого в двоичном режиме, поэтому я могу иметь дескриптор файла, который будет частично в тексте и частично в двоичном?

Если нет, какие варианты у меня есть?

РЕДАКТИРОВАТЬ: Проблема на самом деле, кажется, возникает, когда я передаю двоичные данные в качестве параметра формы CGI. Кто-нибудь знает, в чем может быть проблема? Может быть, ограничение размера?

1 Ответ

1 голос
/ 04 июня 2011

Установить дескриптор файла для использования двоичного файла. Когда вам нужно напечатать что-то, что вы знаете как «текст», явно используйте соответствующую последовательность конца строки. Например, для данных, которые будут обрабатываться в Windows:

binmode $handle;
print $handle $some_text, "\r\n";
print $handle $some_binary_data;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...