PERL CGI:使用二进制和文本模式的Filehandle

时间:2011-06-03 22:59:30

标签: perl cgi

我有一个perl程序,用二进制数据编写application / 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作为变量传递。

问题是这不起作用,某些似乎被传递,因为我被提示下载zip文件,但是zipfile已损坏,我得到了预期的字节与之间的不匹配实际的字节或东西。

认为这与输出缓冲区没有处于二进制模式有关,但我无法以二进制模式读取内容标题,因此我可以将文件句柄部分放在文本中部分是二进制的?

如果没有,我有哪些选择?

编辑:当我将二进制数据作为cgi格式参数传递时,问题实际上似乎发生了。谁知道问题可能是什么?可能有尺寸限制?

1 个答案:

答案 0 :(得分:1)

将文件句柄设置为使用二进制。当您需要打印您知道的“文本”内容时,请明确使用适当的行尾序列。例如,对于将在Windows上处理的数据:

binmode $handle;
print $handle $some_text, "\r\n";
print $handle $some_binary_data;