2016-06-03 3 views
7

Ich versuche eine Perl Mojolicious Anfrage von CLI zu schreiben. Ich möchte eine Datei als Parameter an diese Anfrage übergeben. Unten sind die Dinge, die ich bisher versucht habe, aber ohne Erfolg.Wie debuggen Sie serverseitiges Skript für das Hochladen von Dateien vom Client (locken Sie in diesem Beispiel)?

Unten Beispiel ist, was gut mit mir funktioniert.

curl (working):   curl -X POST "http://localhost:3000/uploadtest.pl/status?Token=6d949625-2f07-1e7a-d57a-de0fa949035d" 
Mojolicious (working): perl ./uploadtest.pl get -v -M POST /status?"Token=3780e99a-fc2c-54e5-2c31-417f945c1792" 

unten ist das das Beispiel, in dem ich stecken bin, becouse unter Perl als Eingabeskript take Datei [Datei-Upload]:

curl (working):   curl -X POST -F [email protected]:/xml/test.xml "http://localhost:3000/uploadtest.pl/upload?Input_Type=XML 
Mojolicious (not working): perl ./uploadtest.pl get -v -M POST /upload?"Input_Type=XML&Input_File=d:/xml/test.xml" 

Es große Hilfe sein, wenn mir jemand hilft aus mit Dies.


#uploadtest.pl 

use Mojolicious::Lite; 

# Upload form in DATA section 
get '/' => 'form'; 


# Check status 
post '/status' => sub { 
    my $self = shift; 
    my $Token = $self->param('Token'); 
    $self->render(text => "In process: $Token"); 
}; 

# Multipart upload handler 
post '/upload' => sub { 
    my $self = shift; 

    # Process uploaded file 
    my $Input_File = $self->param('Input_File'); 
    my $Input_Type = $self->param('Input_Type'); 
    my $size = $Input_File->size; 
    my $name = $Input_File->filename; 
    my $upload = $self->req->upload('Input_File'); 
    $upload->move_to("d:/xml/$name"); #move location 
    $self->render(text => "Thanks for uploading $size byte file $name."); 
}; 

app->start; 
__DATA__ 

@@ form.html.ep 
<!DOCTYPE html> 
<html> 
    <head><title>File Upload</title></head> 
    <body> 
    <form name="FileUpload" action="http://localhost:3000/uploadtest.pl/upload" enctype="multipart/form-data" method="post"> 
     Input Type:</td><td><input type="text" name="Input_Type" /> 
     Please specify a file:</td><td><input type="file" name="Input_File" size="40"></td></tr> 
     <input type="submit" value="Submit"/> 
    </form> 
    <br><br><br><hr><br><br><br> 
    <form name="Status" action="http://localhost:3000/uploadtest.pl/status" method="post"> 
     Token ID: <input type="text" name="Token" /> 
    <input type="submit" value="Check Status"/> 
    </form> 
    </body> 
</html> 
+1

Wenn ich Ihren Titel geklickt Ich dachte, das ist Übergeben einer Datei als Befehlszeilenargument an die Anwendung beim Start. Nur um zu klären, möchten Sie eine Anfrage mit curl senden, die den Inhalt einer Datei als seinen Körper hat? Oder vielleicht nicht. Bitte [bearbeiten] Sie Ihre Frage und klären Sie. Auch, ist der Code, den Sie von upload_test.pl zeigen? – simbabque

+0

Ich habe Curl als auch mojolicious Befehlszeile Beispiel gegeben, die ich versucht habe.Curl funktioniert gut, aber ich weiß nicht, wie man Befehl in mojolicious für Dateiinhalt als Argument verwenden. Könnten Sie mir bitte sagen, wie ich Datei als Befehlsargument in mojolicious übergeben werde? –

Antwort

3

Der Mojolicious Befehl erhalten unterstützt keine Anfragen von Dateien erzeugen, fürchte ich.

perl -Mojo -E 'p("http://localhost:3000" => form => {Input_Type => "XML", Input_File => {file => "d:/xml/test.xml"}})' 

Sie müßten ein ojo Einzeiler verwenden.

+0

Hallo Sebastian, ich denke du hast meine Frage missverstanden. Das einzige, was ich will, ist, die Datei als Argument für Mojolicious vom CLI zu bekommen. Ihre vorgeschlagene Syntax ist für das Debuggen von Code nicht hilfreich. –

4

Ich denke, Sie sind nicht zu verstehen, was post '/upload' tut und uploadtest.pl ist.

Ihr Skript ist ein kleiner HTTP-Server, der Anfragen empfängt und Antworten gibt. Sie können Ihren Server permanent ausführen und Anfragen beispielsweise mit curl ausführen oder eine Anfrage an ihn senden und beenden.

$ perl uploadtest.pl daemon 
[Sat Jun 11 14:00:41 2016] [info] Listening at "http://*:3000" 
Server available at http://127.0.0.1:3000 

# in other shell 
$ curl -X POST "http://localhost:3000/uploadtest.pl/status?Token=6d949625-2f07-1e7a-d57a-de0fa949035d" 

Oder beides auf einmal:

$perl ./uploadtest.pl get -v -M POST /status?"Token=3780e99a-fc2c-54e5-2c31-417f945c1792" 

Diese Stellen machen Anfragen zu einer dauerhaften (erstes Beispiel) oder onetime Server (zweite) mit leeren Inhalt

Wenn Sie Ihre curl laufen mit -v Optionen:

$ curl -v -X POST "http://localhost:3000/status?Token=6d949625-2f07-1e7a-d57a-de0fa949035d" 
* Hostname was NOT found in DNS cache 
* Trying 127.0.0.1... 
* Connected to localhost (127.0.0.1) port 3000 (#0) 
> POST /status?Token=6d949625-2f07-1e7a-d57a-de0fa949035d HTTP/1.1 
> User-Agent: curl/7.35.0 
> Host: localhost:3000 
> Accept: */* 
> 
< HTTP/1.1 200 OK 
* Server Mojolicious (Perl) is not blacklisted 
< Server: Mojolicious (Perl) 
< Date: Sat, 11 Jun 2016 11:42:24 GMT 
< Content-Length: 48 
< Content-Type: text/html;charset=UTF-8 
< 
* Connection #0 to host localhost left intact 
In process: 6d949625-2f07-1e7a-d57a-de0fa949035d 

Sie können sogar tcpdump tun, während Ihr Server abfragt:

$ sudo tcpdump -x -X -i lo port 3000 
14:41:51.665032 IP localhost.49063 > localhost.3000: Flags [P.], seq 1:129, ack 1, win 342, options [nop,nop,TS val 1097613 ecr 1097613], length 128 
    0x0000: 4500 00b4 38c4 4000 4006 037e 7f00 0001 [email protected]@..~.... 
    0x0010: 7f00 0001 bfa7 0bb8 3b17 8750 a281 4839 ........;..P..H9 
    0x0020: 8018 0156 fea8 0000 0101 080a 0010 bf8d ...V............ 
    0x0030: 0010 bf8d 504f 5354 202f 7374 6174 7573 ....POST./status 
    0x0040: 3f54 6f6b 656e 3d36 6439 3439 3632 352d ?Token=6d949625- 
    0x0050: 3266 3037 2d31 6537 612d 6435 3761 2d64 2f07-1e7a-d57a-d 
    0x0060: 6530 6661 3934 3930 3335 6420 4854 5450 e0fa949035d.HTTP 
    0x0070: 2f31 2e31 0d0a 5573 6572 2d41 6765 6e74 /1.1..User-Agent 
    0x0080: 3a20 6375 726c 2f37 2e33 352e 300d 0a48 :.curl/7.35.0..H 
    0x0090: 6f73 743a 206c 6f63 616c 686f 7374 3a33 ost:.localhost:3 
    0x00a0: 3030 300d 0a41 6363 6570 743a 202a 2f2a 000..Accept:.*/* 
    0x00b0: 0d0a 0d0a        .... 

Wenn Sie Datei auf Ihren Server hochladen möchten, verwenden Sie -F [email protected]:/xml/test.xml curl Option. Sie erwarten auch, können Sie gleiche onetime Anfrage tun, aber die nächste Befehl:

$perl ./uploadtest.pl get -v -M POST /upload?"Input_Type=XML&Input_File=d:/xml/test.xml" 

nicht solche Option nicht unterstützt.

$perl ./uploadtest.pl help get 
Usage: APPLICATION get [OPTIONS] URL [SELECTOR|JSON-POINTER] [COMMANDS] 

    ./myapp.pl get/
    ./myapp.pl get -H 'Accept: text/html' /hello.html 'head > title' text 
    ./myapp.pl get //sri:[email protected]/secrets.json /1/content 
    mojo get mojolicious.org 
    mojo get -v -r google.com 
    mojo get -v -H 'Host: mojolicious.org' -H 'Accept: */*' mojolicious.org 
    mojo get -M POST -H 'Content-Type: text/trololo' -c 'trololo' perl.org 
    mojo get mojolicious.org 'head > title' text 
    mojo get mojolicious.org .footer all 
    mojo get mojolicious.org a attr href 
    mojo get mojolicious.org '*' attr id 
    mojo get mojolicious.org 'h1, h2, h3' 3 text 
    mojo get https://api.metacpan.org/v0/author/SRI /name 

Options: 
    -C, --charset <charset>  Charset of HTML/XML content, defaults to 
           auto-detection 
    -c, --content <content>  Content to send with request 
    -H, --header <name:value> Additional HTTP header 
    -h, --help     Show this summary of available options 
     --home <path>   Path to home directory of your application, 
           defaults to the value of MOJO_HOME or 
           auto-detection 
    -M, --method <method>  HTTP method to use, defaults to "GET" 
    -m, --mode <name>   Operating mode for your application, defaults to 
           the value of MOJO_MODE/PLACK_ENV or 
           "development" 
    -r, --redirect    Follow up to 10 redirects 
    -v, --verbose    Print request and response headers to STDERR 

Wie Sie Hilfe finden können, können Sie kurze Textnachricht senden:

./uploadtest.pl get -M POST -H 'Content-Type: text/trololo' -c 'trololo' perl.org 

Um Dateien in Ihrem uploadtest.pl Server hochladen können Sie Ihre eigenen Uploader schreiben. Aus diesem Grund sollten Sie Mojo::UserAgent Modul verwenden.Example

use Mojo::UserAgent; 

# Upload file via POST and "multipart/form-data" 
my $ua = Mojo::UserAgent->new; 
$ua->post("http://localhost:3000" => form => {Input_Type => "XML", Input_File => {file => "d:/xml/test.xml"}}); 

Aber das ist same wie:

perl -Mojo -E 'p("http://localhost:3000" => form => {Input_Type => "XML", Input_File => {file => "d:/xml/test.xml"}})' 

UPD

Debug-Server-Seite Skript für Datei hochladen sollten Sie

perl -d uploadtest.pl daemon 

Loading DB routines from perl5db.pl version 1.49_04 
Editor support available. 

Enter h or 'h h' for help, or 'man perldebug' for more help. 

main::(tx.pl:6): get '/' => 'form'; 
    DB<1> 

Diese Sie in bringen perl debugger (Tutorial)

DB<1> l 1-30 
1 #uploadtest.pl 
2 
3: use Mojolicious::Lite; 
4 
5 # Upload form in DATA section 
6==> get '/' => 'form'; 
7 
8 
9 # Check status 
10 post '/status' => sub { 
11: my $self = shift; 
12: my $Token = $self->param('Token'); 
13: $self->render(text => "In process: $Token"); 
14: }; 
15 
16 # Multipart upload handler 
17 post '/upload' => sub { 
18: my $self = shift; 
19 
20 # Process uploaded file 
21: my $Input_File = $self->param('Input_File'); 
22: my $Input_Type = $self->param('Input_Type'); 
23: my $size = $Input_File->size; 
24: my $name = $Input_File->filename; 
25: my $upload = $self->req->upload('Input_File'); 
26: $upload->move_to("d:/xml/$name"); #move location 
27: $self->render(text => "Thanks for uploading $size byte file $name."); 
28: }; 
29 
30: app->start; 
    DB<2> b 11 
    DB<3> b 18 
    DB<4> l 1-30 
1 #uploadtest.pl 
2 
3: use Mojolicious::Lite; 
4 
5 # Upload form in DATA section 
6==> get '/' => 'form'; 
7 
8 
9 # Check status 
10 post '/status' => sub { 
11:b  my $self = shift; 
12: my $Token = $self->param('Token'); 
13: $self->render(text => "In process: $Token"); 
14: }; 
15 
16 # Multipart upload handler 
17 post '/upload' => sub { 
18:b  my $self = shift; 
19 
20 # Process uploaded file 
21: my $Input_File = $self->param('Input_File'); 
22: my $Input_Type = $self->param('Input_Type'); 
23: my $size = $Input_File->size; 
24: my $name = $Input_File->filename; 
25: my $upload = $self->req->upload('Input_File'); 
26: $upload->move_to("d:/xml/$name"); #move location 
27: $self->render(text => "Thanks for uploading $size byte file $name."); 
28: }; 
29 
30: app->start; 
    DB<5> c 
[Tue Jun 14 16:43:06 2016] [info] Listening at "http://*:3000" 
Server available at http://127.0.0.1:3000 
[Tue Jun 14 16:43:10 2016] [debug] POST "/status" 
[Tue Jun 14 16:43:10 2016] [debug] Routing to a callback 
main::CODE(0x23f7be0)(tx.pl:11):  my $self = shift; 
    DB<5> n 
main::CODE(0x23f7be0)(tx.pl:12):  my $Token = $self->param('Token'); 
    DB<5> n 
main::CODE(0x23f7be0)(tx.pl:13):  $self->render(text => "In process: $Token"); 
    DB<5> x $Token 
0 '6d949625-2f07-1e7a-d57a-de0fa949035d' 
    DB<6> 

Hier Liste ich Quelle von 1 bis 30 Linie l 1-30, stellen zwei Stützpunkte b 11b 18, Liste Quelle wieder l 1-30 zu sehen, dass Haltepunkte in Kraft sind (Hinweis b in der Nähe der Linie), laufen Skript vom aktuellen Punkt (Notice ==> Zeichen in der Nähe der Linie) bis zum nächsten Unterbrechungspunkt, getan zwei Schritte mit n Befehl und Ansicht Wert $ Token Variable mit x $Token Befehl.

Beachten Sie, dass nach c Skript warten Interaktion. Ich das mit curl

http://localhost:3000/status?Token=6d949625-2f07-1e7a-d57a-de0fa949035d 

HINWEIS: Sie sollten verlangen '/ Status' und '/ upload' NICHT '/updater.pl/status' wie Sie. Es hat nichts mit dem äußeren Wort zu tun, wie Ihr Server-Skript benannt ist. Nur nur zwei Dinge:

  1. Wo Ihr Skript hören: localhost: 3000
  2. Welche Anforderung dienen kann: ‚/ upload‘ und ‚/ status‘
+0

Ja, Sie haben Recht, mojolicious Get unterstützt keine Datei als Argument. Ich möchte meinen Code debuggen, der Datei als Argument hat. Curl unterstützt das nicht, also habe ich mojolicious benutzt. Aber es hat keine Funktion für dasselbe. Gibt es eine Alternative, meinen Webservice zu debuggen, der eine Datei als Argument erhält? –

+0

Ich verstehe dich nicht. Sie möchten serverseitiges Skript debuggen, das das Hochladen von Dateien erlaubt oder das Hochladen von Dateien mit Mojo :: UserAgent? Wenn zweitens habe ich [die Antwort] gegeben (http://mojolicious.org/perldoc/Mojolicious/Guides/Cookbook#Large-file-upload) (Das ist dasselbe wie '-F Input_File = @ d: /xml/test.xml ') –

+1

Ja, ich möchte serverseitigen Skript debuggen, die Datei hochladen ermöglichen. –

Verwandte Themen