2008-09-05 146 views
2

我正在使用perl脚本向Google Appengine应用程序发布POST。我使用-F选项发布包含一些XML的文本文件。如何为POST请求获取正确的内容长度

http://www.cpan.org/authors/id/E/EL/ELIJAH/bget-1.1

有一个1.2版本,已经测试并得到了同样的问题。这篇文章看起来像这样。

Host: foo.appspot.com 
User-Agent: lwp-request/1.38 
Content-Type: text/plain 
Content-Length: 202 

<XML> 
    <BLAH>Hello World</BLAH> 
</XML> 

我修改了这个例子,所以202不正确,不用担心。解决问题。 Content-Length与文件中的字节数相匹配,但除非我手动增加Content-Length并不发送所有文件,否则几个字节会被截断。截断的字节数对于不同大小的文件是不一样的。我在脚本上使用了-r选项,我可以看到它正在发送的内容,它正在发送所有文件,但Google Appengine self.request.body显示并非所有内容都已收到。我认为解决方案是为Content-Length获取正确的编号,显然它不像文件字节数那样简单,或者Perl脚本以某种方式破坏它。

更新: 感谢埃里克森的正确答案。我使用printf将字符附加到文件的末尾,并且始终截断文件中的行数。我想我可以通过遍历服务器端的每个字符来找出添加的内容,但不值得。这甚至没有回答在谷歌组设置为应用程序引擎!

回答

3

您需要的额外字节数等于文件中的行数?我问,因为也许它有可能以某种方式引入回车,但不计算在内。

0

你是如何得到字节数? ..通过查看文件系统上文件的大小?

您可以使用“-s”来获取文件的大小。

或者,如果你想要做的更多,你可以使用File::Stat

1

我以前遇到类似的问题。

我假设你正在使用length()函数来确定文件的大小?如果是这样,它可能是你发布的数据是UTF-8编码,而不是ASCII。

要获得正确的计数,您可能需要添加“使用字节数”编译你的脚本的顶部,或在一个块包住长呼:

my $size; do {use bytes; $size = length($file_data)}

从perlfunc手册页:

“注意字符:如果EXPR是采用Unicode,你会获取字符数,而不是字节数。“