1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
if ( open _TEMP_FILE, ">$localfilepath" ) { my $len = 0; $line = <>; FILEREAD: while ( $line = <> ) { # wenn Ende-boundary dann abbrechen if($line =~ /^$boundary/) { last FILEREAD; } # zeilendaten in datei schreiben print _TEMP_FILE $line; $len += length( $line ); } # datei schliessen close _TEMP_FILE; if($line =~ /^$boundary--/) { return; } }
2009-10-04T09:36:31 murphyAuch daher könnte das "Unheil" kommen.Du müsstest binmode halt nicht nur auf das Ausgabedateihandle sondern auch auf das Eingabedateihandle anwenden.
2009-10-04T09:36:31 murphyIch lese aus STDIN. Mit read hätte ich doch Probleme die Boundary zu erkennen!?Ob binmode(ARGV) allerdings wie gewünscht funktioniert weiß ich nicht, schließlich existiert dieses magische Dateihandle erst, wenn man das erste mal daraus gelesen hat. Aber im CGI-Kontext wäre es sowieso sinnvoller, binmode und read auf STDIN anzuwenden, Aus ARGV zu lesen, wie Du es tust, ergibt hier meiner Meinung nach keinen Sinn.
2009-10-04T10:13:22 murphyIch hab´s überall geändert. Danke für den Hinweis!Willst Du von STDIN lesen, musst Du das auch sagen, zum Beispiel durch <STDIN>
QuoteEgal ob Text- oder Binärfile wird am Ende zusätzlich \x0D\x0A angehängt.
QuoteEinem beendenden Boundary gehen also immer CRLF voraus. Demnach mache ich im Prinzip mit dem truncate das Richtige.# Parse up to (and including) the boundary, and dump output.
# Follows the RFC 2046 specification, that the CRLF immediately preceding
# the boundary is part of the boundary, NOT part of the input!
#
# NOTE: while parsing, we take care to remember the EXACT end-of-line
# sequence. This is because we *may* be handling 'binary' encoded data, and
# in that case we can't just massage \r\n into \n! Don't worry... if the
# data is styled as '7bit' or '8bit', the "decoder" will massage the CRLF
# for us. For now, we're just trying to chop up the data stream.
# NBK - Oct 12, 1999
# The CRLF at the end of the current line is considered part
# of the boundary. I buffer the current line and output the
# last. I strip the last CRLF when I hit the boundary.