2008-09-05 19 views
2

Google Appengine uygulamasına POST için perl betiği kullanıyorum. -F seçeneğini kullanarak bazı XML içeren bir metin dosyası gönderiyorum.POST isteği için doğru Content-Length nasıl yapılır

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

Orada zaten test sürüm 1.2, ve aynı sorunu olsun. Mesaj böyle bir şey gibi görünüyor.

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

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

Örneği 202 değiştirilmeden değiştirdim, endişelenme. Soruna açık. İçerik Uzunluğu, dosyadaki baytların sayısıyla eşleşir, ancak Content-Length'ı elle genişletmezse, tüm dosyayı göndermezse, birkaç bayt kısaltılır. Kesilen baytların sayısı, farklı boyutlardaki dosyalar için aynı değildir. Komutta -r seçeneğini kullandım ve ne gönderdiğini görebiliyorum ve tüm dosyayı gönderiyor, ancak Google Appengine self.request.body her şeyin alınmadığını gösteriyor. Çözümün, Content-Length için doğru numarayı elde etmek olduğunu düşünüyorum ve görünüşe göre dosyadaki bayt sayısı kadar basit değil ya da perl betiği bunu bir şekilde hallediyor.

Güncelleme: Doğru cevap için Erickson'a teşekkürler. Karakterleri dosyanın sonuna eklemek için printf kullandım ve her zaman dosyadaki satır sayısını tam olarak kırpmıştım. Sunucu tarafında her karakterin yinelenen ama buna değmeyerek neyin eklendiğini anlayabilirim. Bu, uygulama motoru için ayarlanmış google gruplarında bile yanıtlanmadı!

cevap

3

Dosyadaki satır sayısıyla eşit olması gereken fazladan bayt sayısı nedir? Ben soruyorum çünkü bir şekilde taşıma dönüşlerinin tanıtıldığı ancak sayılmadığı muhtemeldir.

0

Bayt sayısını nasıl alıyorsunuz? .. Dosya sisteminin dosya boyutuna bakarak?

Dosyanın boyutunu öğrenmek için "-s" kullanabilirsiniz. Eğer daha fazlasını yapmak isterseniz kullanabilirsiniz

Veya, File::Stat

1

Daha önce benzer sorunlarla ettik.

Dosya boyutunu belirlemek için length() işlevini kullanıyorsunuzdur? Öyleyse, büyük olasılıkla yayınladığınız veriler ASCII yerine UTF-8 kodludur.

Doğru sayımı elde etmek için "use bytes;" Senaryonuzun üstüne pragma veya blokta uzunluğu çağrıyı sarın:

"karakterlerini Not: IFADE Unicode ise, olur perlfunc adam sayfasından

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

karakter sayısını, bayt sayısını değil. "