【问题标题】:PERL CGI: Filehandle that uses both binary and text modePERL CGI:同时使用二进制和文本模式的文件句柄
【发布时间】:2011-06-04 20:19:22
【问题描述】:

我有一个使用二进制数据编写应用程序/zip 文档的 perl 程序。我可以在我的 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 表单参数传递时,问题实际上似乎发生了。有谁知道可能是什么问题?也许是大小限制?

【问题讨论】:

    标签: perl cgi


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!不幸的是没有解决我的问题。似乎问题在于将二进制数据作为参数传递。
    猜你喜欢
    • 2015-05-10
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2019-05-14
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    相关资源
    最近更新 更多