Also ich hab mal das Beispiel umgesetzt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use warnings;
use strict;
use Socket;
my $host = "www.meinwebserver.in";
my $path = "/index.php";
my $file = "C:\\\\test.jpg";
my $proto = getprotobyname('tcp');
my $iaddr = inet_aton($host);
my $paddr = sockaddr_in( 80, $iaddr);
#print $int_adr;
#print $paddr;
unless ( socket( SOCKET_HANDLER, PF_INET, SOCK_STREAM, $proto ) ) {
die "ERROR : init socket: $!";
}
unless ( connect( SOCKET_HANDLER, $paddr ) ) {
die "no connect: $!\n";
}
my $length = 0;
open (FILE,"< $file") or warn "$!\n";
$length += -s FILE;
my @head = (
"POST " . $host . $path . " HTTP/1.1",
"Host: $host",
"User-Agent: z-uploader",
"Content-Length: $length",
"Content-Type: multipart/form-data; boundary=zzzzzzzzzzzzzzzzzzz",
"",
"--zzzzzzzzzzzzzzzzzzz",
"Content-Disposition: form-data; name=\"file\"; filename=\"$file\"",
"Content-Type: application/octet-stream",
"",
"",
);
try to get total length
my $header = join( "\r\n", @head );
$length += length($header);
$head[3] = "Content-Length: $length"; #2472
my $header = join( "\r\n", @head );
$length = -s FILE;
$length += length($header);
select SOCKET_HANDLER;
$| = 1;
binmode SOCKET_HANDLER;
print SOCKET_HANDLER $header;
while( sysread(FILE, my $buf, 8196 ) ) {
if( length($buf) < 8196 ) {
$buf = $buf."\r\n--zzzzzzzzzzzzzzzzzzz--";
syswrite(SOCKET_HANDLER, $buf, length($buf));
} else {
syswrite(SOCKET_HANDLER, $buf, 8196);
}
print STDOUT '.',
}
close FILE;
shutdown SOCKET_HANDLER, 1;
my @data = (<SOCKET_HANDLER>);
print STDOUT "result->@data\n";
close SOCKET_HANDLER;
Nur leider funktioniert es noch nicht wie gewuenscht.
Ein paar Sachen verwundern mich auch:
1. Fuer was wird die gesamte laenge berechnet?
Die variable wird doch nirgends benutzt.
2. Sollte nicht eigentlich nur die Content-Length angegeben werden?
Weil in dem Beispiel wird der Header ja mitgezaehlt.
3. Warum wird shutdown Socket vor dem auslesen aufgerufen?
Beim ausfuehren bleibt @data komplett leer, man bekommt nicht mal eine Fehlermeldung durch den Socket.
Was aber nicht an dem Aufruf von shutdown() liegt, weil wenn ich es am Ende des Script aufrufe kommt das gleiche Ergebnis.
Waer super wenn Ihr mir da mal auf die Spruenge helfen koenntet.
mfg
garten