Frage

Ich verwende ein Perl-Skript zum POST an die Google Appengine-Anwendung.Ich poste eine Textdatei, die etwas XML enthält, mit der Option -F.

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

Es gibt eine Version 1.2, die bereits getestet wurde und das gleiche Problem aufweist.Der Beitrag sieht ungefähr so ​​aus.

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

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

Ich habe das Beispiel so geändert, dass die 202 nicht stimmt, machen Sie sich darüber keine Sorgen.Weiter zum Problem.Die Inhaltslänge entspricht der Anzahl der Bytes in der Datei. Wenn ich die Inhaltslänge jedoch nicht manuell erhöhe, wird nicht die gesamte Datei gesendet, sondern einige Bytes werden abgeschnitten.Die Anzahl der abgeschnittenen Bytes ist bei Dateien unterschiedlicher Größe nicht gleich.Ich habe die Option -r im Skript verwendet und kann sehen, was es sendet, und es sendet die gesamte Datei, aber Google Appengine self.request.body zeigt an, dass nicht alles empfangen wird.Ich denke, die Lösung besteht darin, die richtige Zahl für die Inhaltslänge zu ermitteln, und anscheinend ist es nicht so einfach, nur die Anzahl der Bytes in der Datei anzugeben, oder das Perl-Skript verstümmelt sie irgendwie.

Aktualisieren:Vielen Dank an Erickson für die richtige Antwort.Ich habe printf verwendet, um Zeichen an das Ende der Datei anzuhängen, und es hat immer genau die Anzahl der Zeilen in der Datei abgeschnitten.Ich schätze, ich könnte herausfinden, was hinzugefügt wird, indem ich jedes Zeichen auf der Serverseite durchlaufe, aber das lohnt sich nicht.Dies wurde noch nicht einmal in den Google-Gruppen beantwortet, die für die App Engine eingerichtet wurden!

War es hilfreich?

Lösung

Entspricht die Anzahl der zusätzlichen Bytes, die Sie benötigen, der Anzahl der Zeilen in der Datei?Ich frage, weil es vielleicht möglich ist, dass Wagenrückläufe eingeführt, aber nicht gezählt werden.

Andere Tipps

Ich bin schon einmal auf ähnliche Probleme gestoßen.

Ich gehe davon aus, dass Sie die Funktion length() verwenden, um die Größe der Datei zu bestimmen.Wenn ja, sind die Daten, die Sie veröffentlichen, wahrscheinlich UTF-8-codiert und nicht ASCII.

Um die richtige Zählung zu erhalten, müssen Sie möglicherweise eine "Verwendung von Bytes verwenden" hinzufügen. Pragma oben in Ihrem Skript oder wickeln Sie den Längenaufruf in einen Block ein:

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

Aus der perlfunc-Manpage:

„Beachten Sie die Zeichen:Wenn EXPR in Unicode vorliegt, erhalten Sie die Anzahl der Zeichen und nicht die Anzahl der Bytes.

Wie ermitteln Sie die Anzahl der Bytes?..Indem Sie sich die Größe der Datei im Dateisystem ansehen?

Sie können „-s“ verwenden, um die Größe der Datei zu ermitteln.

Oder, wenn Sie mehr tun möchten, können Sie verwenden Datei::Stat

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top