3

Google Appengine アプリケーションに POST するために perl スクリプトを使用しています。-F オプションを使用して、XML を含むテキスト ファイルを投稿します。

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 スクリプトが何らかの形でマングリングしているほど単純ではないようです。

更新: 正しい答えをくれた Erickson に感謝します。printf を使用してファイルの末尾に文字を追加すると、常にファイル内の行数が正確に切り捨てられました。サーバー側のすべての文字を繰り返し処理することで、追加されているものを把握できると思いますが、それだけの価値はありません。これは、App Engine 用に設定された Google グループでも回答されませんでした!

4

3 に答える 3

3

必要な余分なバイト数は、ファイルの行数と同じですか? おそらく、どういうわけか改行が導入されているがカウントされていない可能性があるためです。

于 2008-09-05T17:53:02.873 に答える
1

私は以前に同様の問題に遭遇しました。

ファイルのサイズを決定するために length() 関数を使用していると思いますか? その場合、投稿しているデータは ASCII ではなく UTF-8 でエンコードされている可能性があります。

正しいカウントを取得するには、「use bytes;」を追加する必要がある場合があります。プラグマをスクリプトの先頭に追加するか、長さの呼び出しをブロックでラップします。

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

perlfunc の man ページから:

「文字に注意してください。EXPR が Unicode の場合、バイト数ではなく、文字数を取得します。」

于 2008-09-05T18:52:54.367 に答える
0

どのようにバイト数を取得していますか? ..ファイルシステム上のファイルのサイズを見て?

「-s」を使用して、ファイルのサイズを取得できます。

または、もっとやりたい場合は、File::Statを使用できます。

于 2008-09-05T17:56:20.807 に答える