Schrift
[thread]10089[/thread]

File upload per POST

Leser: 2


<< >> 7 Einträge, 1 Seite
garten
 2007-08-15 13:12
#98192 #98192
User since
2007-08-14
6 Artikel
BenutzerIn
[default_avatar]
Hi,

ich moechte gern mit meinem Script eine Datei auf meinen Server laden.
Hab auch schon eine funktionierende Loesung gefunden.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
use LWP;
use HTTP::Request::Common;
$ua = $ua = LWP::UserAgent->new;;
$res = $ua->request(POST 'http://www.host.de/index.php',
Content_Type => 'form-data',
Content => [
file => ["C:\\\\name.jpg", "name.jpg"],
],
);
print $res->as_string();


Wuerd das ganze aber lieber ohne das HTTP::Request Modul, per Hand, mit IO::Socket realisieren.

Hat jemand ein Beispiel wie das dann aussehen muss, wenn ich den Header und Content selber zusammenbaue und das dann in den Socket schreibe?
Hab schon einige Sachen probiert bisher leider ohne Erfolg.

Danke im Voraus

mfg

garten
bieber
 2007-08-15 13:19
#98195 #98195
User since
2007-06-18
148 Artikel
BenutzerIn
[default_avatar]
hast du dir das schon mal durchgelesen?! wiki-upload
Es gibt immer Leute die meinen, sie seien schlauer als ich. Das Schlimmste ist, sie sind es auch.
renee
 2007-08-15 13:26
#98198 #98198
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@bieber: Ich glaube garten wollte nicht das Serverseitige Skript schreiben, sondern den Client...

@garten: soll es über http oder ftp gehen?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
garten
 2007-08-15 13:32
#98200 #98200
User since
2007-08-14
6 Artikel
BenutzerIn
[default_avatar]
@renee

genau ein client solls werden und per HTTP
wie es an dem Beispiel zuerkennen ist ;)

aber echt mal ein Kompliment ihr seit hier echt fix mit dem Antworten
cooles Board
renee
 2007-08-15 13:42
#98202 #98202
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Schau Dir das mal an: http://www.nntp.perl.org/group/perl.beginners/2007...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
garten
 2007-08-16 23:18
#98221 #98221
User since
2007-08-14
6 Artikel
BenutzerIn
[default_avatar]
Also ich hab mal das Beispiel umgesetzt.


Code: (dl )
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
garten
 2007-08-15 21:04
#98228 #98228
User since
2007-08-14
6 Artikel
BenutzerIn
[default_avatar]
hey renee

ist ein sehr schoenes Beispiel.
Genau das was ich gesucht habe.

Hab es mal nachgebaut aber bekomme leider keine Antwort vom Server.

hast Du eigentlich ICQ, MSN oder der gleichen?

Gruesse

garten
<< >> 7 Einträge, 1 Seite



View all threads created 2007-08-15 13:12.